Queria ajuda pra resolver esse exercício, tenho que fazer uma calculadora usando sockets em java, onde o cliente entra com a operação e envia para o servidor que gera 2 números para realizar o calculo e envia esse 2 números para o cliente, em sequencia o cliente tem que entrar com a resposta do calculo e depois o servidor informa se a resposta do cliente esta certa ou errada.
Ate agora fiz isso, poderiam me dizer onde estou errando.
classe cliente
public class Cliente {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket cliente = new Socket("127.0.0.1", 6789);
System.out.println("O cliente se conectou ao servidor!");
ObjectInputStream result = new ObjectInputStream(cliente.getInputStream());
ObjectOutputStream dados = new ObjectOutputStream(cliente.getOutputStream());
Scanner teclado = new Scanner(System.in);
int opr = 0;
while (!((opr >= 1) && (opr <= 4))) {
System.out.println("Escolha a operação: \n1 para + ; 2 para - ; 3 para * ; 4 para /");
opr = teclado.nextInt();
}
dados.writeInt(opr);
dados.flush();
System.out.println("Qual o Resultado de: "+result.readLine()+"\n");
double resposta = teclado.nextDouble();
dados.writeDouble(resposta);
dados.flush();
System.out.println(result.readLine());
result.close();
dados.close();
cliente.close();
}
}
classe servidor
public class Servidor {
public static void main(String[] args) {
try {
ServerSocket servidor = new ServerSocket(6789);
System.out.println("Ouvindo a porta 6789");
Socket cliente = servidor.accept();
System.out.println("Cliente conectado: " + cliente.getInetAddress().getHostAddress());
ObjectOutputStream result = new ObjectOutputStream(cliente.getOutputStream());
ObjectInputStream dados = new ObjectInputStream(cliente.getInputStream());
int opr, total = 0;
opr = dados.readInt();
int num1 = (int)(Math.random() * 10 + 1);
int num2 = (int)(Math.random() * 10 + 1);
if (opr == 1) {
total = num1 + num2;
result.writeChars(num1+"+"+num2);
} else if (opr == 2) {
total = num1 - num2;
result.writeChars(num1+"-"+num2);
} else if (opr == 3) {
total = num1 * num2;
result.writeChars(num1+"*"+num2);
} else {
total = num1 / num2;
result.writeChars(num1+"/"+num2);
}
result.flush();
double resposta = dados.readDouble();
if(resposta == total){
result.writeChars("Acertou");
}else{
result.writeChars("Errou");
}
result.flush();
result.close();
dados.close();
servidor.close();
} catch (Exception e) {
System.out.println("Erro: " + e.getMessage());
} finally {
}
}
}
Apos enviar o tipo de operação para o servidor, o servidor não retorna os números gerados para cliente responder.
Ele ate retorna se eu tirar esse bloco de código do servidor
double resposta = dados.readDouble();
if(resposta == total){
result.writeChars(“Acertou”);
}else{
result.writeChars(“Errou”);
}
Mas se eu fizer isso o servidor fecha e não consigo enviar a resposta do calculo.
Alguém pode me ajudar, ja pesquei em tudo quanto é lugar e nada.
O seu problema é que o seu servidor envia os dados de uma forma (writeChars
) e você lê de outra forma (readLine
).
Se escreve um tipo de dado, tem que ler aquele tipo de dado.
Eu dei uma refatorada no seu código, vê se assim fica mais claro:
Classe Servidor:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Servidor {
public static void main(String[] args) {
try {
Servidor servidor = new Servidor(6789);
servidor.executar();
} catch (Throwable t) {
t.printStackTrace();
}
}
private final int porta;
public Servidor(int porta) throws IOException {
this.porta = porta;
}
public void executar() throws IOException {
ServerSocket servidor = new ServerSocket(porta);
System.out.println("Ouvindo a porta " + porta);
Socket cliente = null;
while ((cliente = servidor.accept()) != null) { // aguarda um cliente se conectar
System.out.println("Cliente conectado: " + cliente.getInetAddress().getHostAddress());
DataOutputStream saida = new DataOutputStream(cliente.getOutputStream());
DataInputStream entrada = new DataInputStream(cliente.getInputStream());
// ler operação escolhida pelo cliente
int opr = entrada.readInt(); // o cliente enviou com writeInt, então leio com readInt
int num1 = (int) (Math.random() * 10 + 1);
int num2 = (int) (Math.random() * 10 + 1);
String operacao = null;
double resultado = 0;
switch (opr) {
case 1:
operacao = "+";
resultado = num1 + num2;
break;
case 2:
operacao = "-";
resultado = num1 - num2;
break;
case 3:
operacao = "*";
resultado = num1 * num2;
break;
case 4:
operacao = "/";
resultado = num1 / (double) num2;
break;
}
// enviar mensagem para o cliente
String mensagem = num1 + operacao + num2;
saida.writeUTF(mensagem);
saida.flush();
// ler resposta do cliente
double resposta = entrada.readDouble(); // o cliente enviou com writeDouble, então leio com readDouble
// enviar mensagem pro cliente
mensagem = resposta == resultado ? "Acertou" : "Errou";
saida.writeUTF(mensagem);
saida.flush();
// fechar streams e volta ao inicio do laço pra aguardar outra conexão
saida.close();
entrada.close();
}
servidor.close();
}
}
Classe Cliente:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Cliente {
public static void main(String[] args) throws UnknownHostException, IOException {
try {
Cliente cliente = new Cliente("127.0.0.1", 6789);
cliente.executar();
} catch (Throwable t) {
t.printStackTrace();
}
}
private final Scanner teclado = new Scanner(System.in);
private final String host;
private final int porta;
public Cliente(String host, int porta) {
this.host = host;
this.porta = porta;
}
public void executar() throws IOException {
Socket cliente = new Socket(host, porta);
System.out.println("O cliente se conectou ao servidor!");
DataInputStream entrada = new DataInputStream(cliente.getInputStream());
DataOutputStream saida = new DataOutputStream(cliente.getOutputStream());
int opr = 0;
while (!((opr >= 1) && (opr <= 4))) {
System.out.println("Escolha a operação: \n1 para + ; 2 para - ; 3 para * ; 4 para /");
opr = Integer.parseInt(teclado.nextLine()); // ao ler entrada do TECLADO sempre use nextLine()
}
// enviar operação ao servidor
saida.writeInt(opr);
saida.flush();
// ler mensagem do servidor
String mensagem = entrada.readUTF(); // o servidor enviou com writeUTF, então leio com readUTF
System.out.println("Qual o Resultado de: " + mensagem + "\n");
// enviar resposta ao servidor
double resposta = Double.parseDouble(teclado.nextLine());// ao ler entrada do TECLADO sempre use nextLine()
saida.writeDouble(resposta);
saida.flush();
// ler mensagem do servidor
mensagem = entrada.readUTF(); // o servidor enviou com writeUTF, então leio com readUTF
System.out.println(mensagem);
// fechar streams
entrada.close();
saida.close();
cliente.close();
}
}
1 curtida
Muito obrigado, realmente não me atentei a isso