2016-05-05 6 views
0

Hy, ich versuche, zwei Nummern über Socket zu senden. Der Server erhält die Nummern und ich berechne etwas, aber wenn ich das Ergebnis an den Kunden zurücksende, erhält der Kunde eine Nummer, die er mir sendet.Socket Java - Client erhält eine falsche Information

Wo mache ich falsch beceause verstehe ich nicht?

Client.java

public class Client { 
    private static Socket socket; 
    public static void main(String args[]) { 
     try { 
      String host = "localhost"; 
      int port = 25010; 
      InetAddress address = InetAddress.getByName(host); 
      socket = new Socket(address, port); 

      //Send the message to the server 
      OutputStream os = socket.getOutputStream(); 
      OutputStreamWriter osw = new OutputStreamWriter(os); 
      BufferedWriter bw = new BufferedWriter(osw); 

      String number = "2"; 
      String number2 = "5"; 

      String sendMessage = number + "\n"; 
      String sendMessage2 = number2 + "\n"; 
      bw.write(sendMessage); 
      bw.write(sendMessage2); 
      bw.flush(); 
      System.out.println("Message sent to the server:\n" + sendMessage + sendMessage2); 

      //Get the return message from the server 
      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String message = br.readLine(); 
      System.out.println("Message received from the server : " + message); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } finally { 
      //Closing the socket 
      try { 
       socket.close(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Server.java

public class Server { 
    private static Socket socket; 
    public static void main(String[] args) { 
     try { 
      int port = 25010; 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server Started and listening to the port " + port); 
      ArrayList<String> arr = new ArrayList<String>(); 

      //Server is running always. This is done using this while(true) loop 
      while(true) { 
       //Reading the message from the client 
       socket = serverSocket.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  // primeste mesaj de la client 
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // transmite raspuns catre client 
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

       String inputLine; 
       while ((inputLine = br.readLine()) != null) { 
        out.println(inputLine); 
        arr.add(inputLine.trim()); 
       } 

       System.out.println("Message received from client is:"); 
       for (int i = 0; i < arr.size(); i++) { 
        System.out.println(arr.get(i)); 
       } 

       //Return message 
       String returnMessage = null; 
       try { 
        int numberInIntFormat = 0; 
        int num = 1; 
        for (int i = 0; i < arr.size(); i++) { 
         System.out.println(arr.get(i)); 
         numberInIntFormat = Integer.parseInt(arr.get(i)); 
         num = num * numberInIntFormat; 
        } 
        arr.clear(); 
        returnMessage = String.valueOf(num); 
       } catch(NumberFormatException e) { 
        //Input was not a number. Sending proper message back to client. 
        returnMessage = "Please send a proper number\n"; 
       } 

       //Sending the response back to the client. 
       bw.write(returnMessage); 
       bw.flush(); 
       System.out.println("returnMessage = " + returnMessage); 
       System.out.println("Message sent to the client is "+ returnMessage); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       socket.close(); 
      } catch(Exception e) {} 
     } 
    } 
} 
+1

Veröffentlichen Sie Ihre Konsolenausgaben. – shmosel

+0

Ich postete jetzt :) – Doro

Antwort

-1

ich eine bessere Methode gefunden:

while (br.ready() && (inputLine = br.readLine()) != null) 

Dies erzählen, den Puffer zu lesen, wenn es ist etwas zu lesen.

Mit der Antwort von @ John Bollinger, liest der Puffer nur bis zum ersten Zeilenumbruch, also, wenn Sie versuchen, einen String zu analysieren, der einen Zeilenumbruch enthält, werden Sie herauskommen, wenn der Zeilenumbruch erscheint.

Mit br.ready() wird es alle String analysieren und wird am Ende des Puffers aussteigen.

+0

NeinEs wird die Schleife verlassen, wenn keine Daten zum Lesen ohne Blockierung verfügbar sind. Das ist selten was du willst. – EJP

0

Ihr Server-Code hallt alles, was sie von dem Client liest an den Client zurück, bevor er tut alles, was mit ihm:

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  // primeste mesaj de la client 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // transmite raspuns catre client 
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

    String inputLine; 
    while ((inputLine = br.readLine()) != null) { 
     out.println(inputLine); // <-- HERE 
     arr.add(inputLine.trim()); 
    } 

Es überrascht nicht, dass der Client erhält, was der Server gesendet hat.

+0

Ich wischte diese Linie, die Sie mir sagen, und jetzt der Server keine Nachricht zurücksenden ... Ich warte und ich warte ... – Doro

+0

@Doro gibt es andere Fehler. – granmirupa

+0

Nun, das liegt daran, dass der Server nicht wissen kann, dass der Client Eingaben gesendet hat. 'BufferedReader.readLine()' gibt am Ende der Datei 'null' zurück, aber das Dateiende wird in einer Netzwerkverbindung nicht erreicht, bis die Verbindung geschlossen wird. –

0
String inputLine; 
while ((inputLine = br.readLine()) != null) { 
    arr.add(inputLine.trim()); 
} 

Mit dieser Änderung ist der Ausgang:

Server:

Server Started and listening to the port 25010 

Auftraggeber:

Message sent to the server: 
2 
5 

Und nun der Server 'blockiert' in While-Schleife und der Client nicht reci Irgendwelche Rückmeldungen.

0

Versuchen Sie folgendes:

Auftraggeber:

public class Client { 
    private static Socket socket; 
    public static void main(String args[]) { 
     try { 
      String host = "localhost"; 
      int port = 25010; 
      InetAddress address = InetAddress.getByName(host); 
      socket = new Socket(address, port); 

      //Send the message to the server 
      OutputStream os = socket.getOutputStream(); 
      OutputStreamWriter osw = new OutputStreamWriter(os); 
      BufferedWriter bw = new BufferedWriter(osw); 

      String number = "2"; 
      String number2 = "5"; 

      String sendMessage = number + "\n"; 
      String sendMessage2 = number2 + "\n"; 
      bw.write(sendMessage); 
      bw.write(sendMessage2); 
      bw.newLine(); // You need to send a special line for say to the server: "Hey, I have done"; 
      bw.flush(); 
      System.out.println("Message sent to the server:\n" + sendMessage + sendMessage2); 

      //Get the return message from the server 
      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String message = br.readLine(); 
      System.out.println("Message received from the server : " + message); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } finally { 
      //Closing the socket 
      try { 
       socket.close(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Server:

public class Server { 
    private static Socket socket; 
    public static void main(String[] args) { 
     try { 
      int port = 25010; 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server Started and listening to the port " + port); 
      ArrayList<String> arr = new ArrayList<String>(); 

      //Server is running always. This is done using this while(true) loop 
      while(true) { 
       //Reading the message from the client 
       socket = serverSocket.accept(); 
       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  // primeste mesaj de la client 
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // transmite raspuns catre client 
       PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

       String inputLine; 
       while ((inputLine = br.readLine()) != null && inputLine.length() > 0) { // You need to stop loop when you get empty line 
        // out.println(inputLine); 
        arr.add(inputLine.trim()); 
        System.out.println("Message received from client is:"+inputLine.trim()); 
       } 

       System.out.println("Message received from client is:"); 

       //Return message 
       String returnMessage = null; 
       try { 
        int numberInIntFormat = 0; 
        int num = 1; 
        for (int i = 0; i < arr.size(); i++) { 
         System.out.println(arr.get(i)); 
         numberInIntFormat = Integer.parseInt(arr.get(i)); 
         num = num * numberInIntFormat; 
        } 
        arr.clear(); 
        returnMessage = String.valueOf(num); 
       } catch(NumberFormatException e) { 
        //Input was not a number. Sending proper message back to client. 
        returnMessage = "Please send a proper number\n"; 
       } 

       //Sending the response back to the client. 
       bw.write(returnMessage+"\n"); // You need to add '\n' otherwise readLine never gets; 
       bw.flush(); 
       System.out.println("returnMessage = " + returnMessage); 
       System.out.println("Message sent to the client is "+ returnMessage); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       socket.close(); 
      } catch(Exception e) {} 
     } 
    } 
} 
+0

Vielen Dank. Das funktioniert: D – Doro

+0

Damit dies eine nützliche Antwort (für die Community) ist, müssten Sie erklären, was Sie geändert haben und warum. –

+0

@JohnBollinger tat ich. In den Code habe ich einige Kommentare hinzugefügt – granmirupa