2016-03-21 88 views
0

我想創建一個簡單的計算器使用套接字,但是當我向服務器發送數字我有一個問題:例如,如果我想添加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

回答

0

原始代碼使用BufferedReader,我認爲這可能是問題的原因。如果將其替換爲DataInputStream,則可以撥打readInt()readDouble()方法。

BufferedReader in;替換爲DataInputStream in;。它可以以類似的方式被構造爲使用現有的代碼:

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

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

+0

非常感謝,這解決了我的問題! – Froz3

0

我得到它通過去除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

我已經添加了另一個建議。如果那工作正常,我會刪除這個答案。 –