Java客户端/服务器计算器不工作

时间:2016-03-21 16:44:05

标签: java sockets server client

我正在尝试使用套接字创建一个简单的计算器但是当我向服务器发送数字时我遇到了问题:例如,如果我想添加2个数字x = 13且y = 2,则服务器接收x = 64并且y = 42,结果是106.我认为问题在于方法写入,我对字符串没有问题,但有数字我不知道如何工作。我是初学者,谢谢你的帮助。

SERVER

    package calcolatrice;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    ServerSocket server;
    Socket msocket;
    BufferedReader in;
    DataOutputStream out;
    public Socket attendi() {
        try {
            //creo il server sulla porta ****
            System.out.println("Server in esecuzione..");
            server = new ServerSocket(1122);

            //accetto eventuale connessione da parte del client
            msocket = server.accept();
            System.out.println("Client connesso con successo! ");

            //chiudo la connessione per evitare altre connessioni
            server.close();

            //inizializzo gli stream per consentire la comunicazione
            out = new DataOutputStream(msocket.getOutputStream());
            in = new BufferedReader(new InputStreamReader(msocket.getInputStream()));

        } catch (IOException e) {
            System.out.println(e.getMessage());
            System.out.println("Errore durante l'istanza del server");
            System.exit(1);
        }
        return msocket;
    }


    public void calcola(){
        try{
            double x;
            double y;
            double risultato=0;
            //leggo la scelta e in base a quella eseguo le operazioni
            int scelta = in.read();

            //accetto prima i numeri
            x = in.read();

            System.out.println("x "+x);
            y = in.read();
            System.out.println("y "+y);

            switch (scelta){
                case 1:
                    System.out.println("Scelta: "+scelta);
                    //somma
                    risultato = x+y;


            }
            System.out.println("Risultato: "+risultato);

        }catch (Exception e){

        }
    }


    public static void main(String args[]) {
        Server myServer = new Server();
        myServer.attendi();
        myServer.calcola();
    }
}

客户端

    package calcolatrice;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client{
    Socket socket;
    protected int porta = 1122;
    String nomeServer = "localhost";
    //stream per comunicare
    DataOutputStream out;
    BufferedReader in;


    Scanner input = new Scanner(System.in);

    public Socket connetti(){
        try {
            System.out.println("Client avviato..");
            //creo il socket per connettermi al server
            socket = new Socket(nomeServer, porta);
            System.out.println("Client connesso con successo al server ' "+nomeServer+" ' sulla porta: "+porta);
            //inizializzo gli stream per consentire la comunicazione
            out = new DataOutputStream(socket.getOutputStream());
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        } catch (Exception e){
            System.out.println("Errore, impossibile connettersi");
            System.exit(1);
        }
        return socket;

    }

    //menu per scelta operazioni
    private void menu(){
        try{
            System.out.println("---Calcolatrice---");
            System.out.println("[1.Somma \t 2.Differenza \t 3.Moltiplicazione \t 4.Divisione]");
            System.out.println("0.ESCI");
        } catch (Exception e){
            System.out.println("Errore");
        }


    }

    //funzione per comunicare
    public void comunica(){
        try {
            int scelta=0;
            //do{
                menu();
                System.out.println("Inserire operazione ");
                scelta = input.nextInt();
                //invio la scelta al server
                //out.writeByte(scelta);
                out.write(scelta);

                //Inserisco i numeri e li spedisco al server
                System.out.println("Inserisci primo numero.");
                double x = input.nextDouble();
                out.writeDouble(x);

                System.out.println("Inserisci secondo numero.");
                double y = input.nextDouble();
                out.writeDouble(y);

            //}
            //while(scelta != 0);
        }catch (IOException e){

        }


    }

    public static void main(String args[]){
        Client myClient = new Client();
        myClient.connetti();
        myClient.comunica();


    }
}

2 个答案:

答案 0 :(得分:0)

我通过删除DataOutputStream对象(out)来实现它,然后我将以下行添加到comunica()方法中:

System.out.println(x + "," + y);

重新运行代码我得到了输出:

  

客户端avviato ..

     

客户端连接成功服务器' localhost'苏拉波塔:1122

     

--- Calcolatrice ---

     

[1.Somma 2.Differenza 3.Moltiplicazione 4.Divisione]   0.ESCI

     

Inserire operazione

     

1

     

Inserisci primo numero。

     

2

     

Inserisci secondo numero。

     

3

     

2.0,3.0

你的代码正在读数字好。

答案 1 :(得分:0)

原始代码使用BufferedReader我认为可能是问题的原因。如果您将其替换为DataInputStream,则可以调用readInt()readDouble()方法。

BufferedReader in;替换为DataInputStream in;。它可以使用以下方式以与现有代码类似的方式构造:

in = new DataInputStream(msocket.getInputStream());

然后根据需要将in.read()in.readInt()的所有来电替换为in.readDouble()