Calculator using Socket in Java

2

I'm doing a college job and got some information from the Internet, the teacher asked a client to send 2 values and a basic operation, the server should take this and return the total. It turns out that the client only takes the variables of himself, does not take the total that comes from the server and nor the opr that is the symbol of the operation.

public class Servidor2 {

    public static void main(String[] args) throws IOException {

        int num1, num2, total = 0;
        int operacao = 0;
        char opr = 0;

        //Cria um socket na porta 12342
        ServerSocket servidor = new ServerSocket(12342);
        System.out.println("Porta 12342 aberta!");

        // Aguarda alguém se conectar. A execução do servidor
        // fica bloqueada na chamada do método accept da classe
        // ServerSocket. Quando alguém se conectar ao servidor, o
        // método desbloqueia e retorna com um objeto da classe
        // Socket, que é uma porta da comunicação.

        System.out.print("Aguardando conexão do cliente...");
        Socket cliente = servidor.accept();

        System.out.println("Nova conexao com o cliente " + cliente.getInetAddress().getHostAddress());


        ObjectOutputStream resultado = new ObjectOutputStream(cliente.getOutputStream());
        ObjectInputStream dados = new ObjectInputStream(cliente.getInputStream());

        num1 = dados.readInt();
        num2 = dados.readInt();

        operacao = dados.readInt();
        if (operacao == 1) {

            opr = '+';
            total = (num1 + num2);


        }
        if (operacao == 2) {

            opr = '-';
            total = (num1 - num2);
        }
        if (operacao == 3) {


            opr = 'x';
            total = (num1 * num2);
        }
        if (operacao == 4) {


            opr = '/';
            total = (num1 / num2);
        } else {


            System.out.printf("Você digitou uma operação inválida.");

        }

        resultado.writeInt(total);
        resultado.writeChar(opr);
        resultado.flush();
        resultado.flush();
        servidor.close();
    }
}


public class Cliente2 {

    public static void main(String[] args) throws UnknownHostException, IOException {
        int num1 = 0;
        int num2 = 0;
        int operacao = 0;
        char opr;
        Socket cliente = new Socket("127.0.0.1", 12342);
        System.out.println("O cliente conectou ao servidor");


        ObjectInputStream resultado = new ObjectInputStream(cliente.getInputStream());
        ObjectOutputStream dados = new ObjectOutputStream(cliente.getOutputStream());


        num1 = Integer.parseInt(JOptionPane.showInputDialog("Digite o primeiro número"));
        num2 = Integer.parseInt(JOptionPane.showInputDialog("Digite o segundo número"));
        operacao = Integer.parseInt(JOptionPane.showInputDialog("Qual operação desejada? 1= +, 2= -,3= X,4= / "));
        dados.writeInt(operacao);
        dados.writeDouble(num1);
        dados.writeDouble(num2);

        dados.flush();

        int total = resultado.readInt();
        opr = resultado.readChar();
        System.out.println("Total de " + num1 + opr + num2 + " = " + total);

        cliente.close();
    }
}
    
asked by anonymous 06.12.2014 / 15:36

1 answer

1

The problem in your code is when it is time to send and receive the data on the client you are using:

dados.writeInt(operacao);
dados.writeDouble(num1);
dados.writeDouble(num2);

And on the server:

num1 = dados.readInt();
num2 = dados.readInt();
operacao = dados.readInt();

Two problems are noticed here, the first being that you are sending Double and want to receive Integer , and the other would be the order that the data is sent and received, because in the client you send% operacao , num1 and num2 , and on the server you are getting num1 , num2 and operacao , the fact that variables have the same name means nothing in this case.

To solve your problem, set the two classes with Integer or with Double and place the same order of sending and receiving, I'll post how you would use Double .

public class Servidor2 {

    public static void main(String[] args) throws IOException {

        double num1, num2, total = 0.0;
        int operacao;
        char opr = '\n';

        //Cria um socket na porta 12342
        ServerSocket servidor = new ServerSocket(12342);
        System.out.println("Porta 12342 aberta!");

        // Aguarda alguém se conectar. A execução do servidor
        // fica bloqueada na chamada do método accept da classe
        // ServerSocket. Quando alguém se conectar ao servidor, o
        // método desbloqueia e retorna com um objeto da classe
        // Socket, que é uma porta da comunicação.

        System.out.print("Aguardando conexão do cliente...");
        Socket cliente = servidor.accept();

        System.out.println("Nova conexao com o cliente " + cliente.getInetAddress().getHostAddress());


        ObjectOutputStream resultado = new ObjectOutputStream(cliente.getOutputStream());
        ObjectInputStream dados = new ObjectInputStream(cliente.getInputStream());

        operacao = dados.readInt();
        num1 = dados.readDouble();
        num2 = dados.readDouble();

        if (operacao == 1) {

            opr = '+';
            total = (num1 + num2);

        } else if (operacao == 2) {

            opr = '-';
            total = (num1 - num2);

        } else if (operacao == 3) {

            opr = 'x';
            total = (num1 * num2);

        } else {

            opr = '/';
            total = (num1 / num2);

        }

        resultado.writeDouble(total);
        resultado.writeChar(opr);
        resultado.flush();

        resultado.close();
        dados.close();
        servidor.close();
    }
}
  

Note: In this case you can use if and else if instead of only if , this prevents unnecessary checks depending on opr . Note 2: The validation of the operation is easier to make directly on the client.

Note 3: It is not necessary to use resultado.flush(); twice.

public class Cliente2 {

    public static void main(String[] args) throws UnknownHostException, IOException {
        double num1;
        double num2;
        int operacao = 0;
        char opr;
        Socket cliente = new Socket("127.0.0.1", 12342);
        System.out.println("O cliente conectou ao servidor");


        ObjectInputStream resultado = new ObjectInputStream(cliente.getInputStream());
        ObjectOutputStream dados = new ObjectOutputStream(cliente.getOutputStream());


        num1 = Double.parseDouble(JOptionPane.showInputDialog("Digite o primeiro número"));
        num2 = Double.parseDouble(JOptionPane.showInputDialog("Digite o segundo número"));
        while (!((operacao >= 1) && (operacao <= 4))) {
            operacao = Integer.parseInt(JOptionPane.showInputDialog("Qual operação desejada? 1= +, 2= -,3= X,4= / "));
            if (!((operacao >= 1) && (operacao <= 4))) {
                System.out.println("Você digitou uma operação inválida.");
            }
        }
        dados.writeInt(operacao);
        dados.writeDouble(num1);
        dados.writeDouble(num2);
        dados.flush();

        double total = resultado.readDouble();
        opr = resultado.readChar();
        System.out.println("Total de " + num1 + opr + num2 + " = " + total);

        resultado.close();
        dados.close();
        cliente.close();
    }
}
  

Note: The validation done consists of a loop that verifies that the operation entered is in 1 and 4, if it is not, it prints to the console and requests the operation again for the user. >

    
06.12.2014 / 18:23