2016-03-21 6 views
0

Ich versuche, einen einfachen Rechner mit Sockets zu erstellen, aber wenn ich Zahlen an den Server senden habe ich ein Problem: zum Beispiel, wenn ich 2 Zahlen x = 13 und y = 2 hinzufügen möchte der Server erhält x = 64 und y = 42 und das Ergebnis ist 106. Ich denke, dass das Problem mit der Methode schreiben ist, habe ich kein Problem mit Strings, aber mit Zahlen, weiß ich nicht, wie man arbeitet. Ich bin ein Anfänger, danke für die Hilfe.Java Client/Server Rechner funktioniert nicht

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

Erste Sache zu verstehen, wenn Sie programmieren: Sie sollten Bedenken trennen. Der Code, der Zahlen analysiert und Ergebnisse berechnet, braucht absolut nichts über Sockets und Streams zu wissen. und so weiter. Bedeutung: Schreiben Sie zuerst Code, der die Eingabe (des Formulars, das Sie später über Sockets senden möchten) und berechnet die Ausgabe basierend auf dieser Eingabe. Wenn das alles gut funktioniert und vollständig getestet ist (Sie sollten Komponententests dafür verwenden); dann können Sie einen Schritt weiter gehen und den Client/Server-Teil hinzufügen.Es ist einfacher, Puzzles mit 10 Stücken zu lösen als mit 100. – GhostCat

Antwort

0

Der ursprüngliche Code verwendet eine BufferedReader, die ich denke, könnte die Ursache des Problems sein. Wenn Sie dies durch eine DataInputStream ersetzen, können Sie die Methoden readInt() und readDouble() aufrufen.

Ersetzen Sie BufferedReader in; durch DataInputStream in;. Es kann mit in ähnlicher Weise an dem vorhandenen Code konstruiert werden:

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

Dann alle Anrufe entweder mit in.readInt() oder in.readDouble() als angemessen in.read() ersetzen.

+0

Vielen Dank Mann, das hat mein Problem gelöst! – Froz3

0

Ich habe es durch Entfernen des Dataoutputstream-Objekt zu arbeiten (out), dann habe ich die folgende Zeile in der comunica() -Methode:

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

Erneute Ausführung des Codes Ich habe die Ausgabe:

Kunde avviato ..

Client-connesso con successo al-Server 'localhost' sulla porta: 1122

--- --- Calcolatrice

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

Inserire operazione

Inserisci primo numero.

Inserisci secondo numero.

2.0,3.0

Ihr Code ist OK in den Zahlen zu lesen.

+0

Wie soll es ohne den DataOutputStream funktionieren? – Froz3

+0

Ich habe einen anderen Vorschlag hinzugefügt. Wenn das OK ist, lösche ich diese Antwort. –