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

问题描述:

我想创建一个简单的计算器使用套接字,但是当我向服务器发送数字我有一个问题:例如,如果我想添加2个数字x = 13和y = 2服务器接收x = 64和y = 42,结果是106.我认为问题出在方法编写上,我对字符串没有问题,但是数字我不知道如何工作。我是初学者,感谢您的帮助。Java客户端/服务器计算器不工作

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(); 
    } 
} 

CLIENT

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

编程时首先要了解的是:您应该分开关注点。解析数字和计算结果的代码......绝对不需要知道有关套接字,流的任何信息;等等。含义:首先编写需要输入的代码(以后需要通过套接字发送的表单),然后根据该输入计算输出。当所有这些工作正常,并且经过充分测试(你应该使用单元测试);那么你可以更进一步并添加客户端/服务器部分。解决10个拼图比解决100个拼图更容易。 – GhostCat

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

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

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

然后,用in.readInt()in.readDouble()酌情更换所有呼叫in.read()

+0

非常感谢,这解决了我的问题! – Froz3

我得到它通过去除DataOutputStream类对象(下)然后添加以下行到comunica()方法来工作:

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

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

客户avviato ..

客户connesso CON SUCCESSO人服务器 'localhost' 的苏拉PORTA:1122

--- --- Calcolatrice

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

别名选择operazione

Inserisci primo numero。

Inserisci secondo numero。

2.0,3.0

您的代码正在读取数确定。

+0

如何在没有DataOutputStream的情况下工作? – Froz3

+0

我已经添加了另一个建议。如果那工作正常,我会删除这个答案。 –