-1

In meinem einfachen Java Client-Server-Programm, beim Senden einer Nachricht an den Server und Lesen dort, readInt() liest unbegrenzt, so dass das Programm dort bleiben.Server Socket liest Client-Nachricht unbegrenzt in Java

ich sicher, dass ich nur das Senden und ein int, sonst nichts empfangen, wie Sie durch den Code sagen kann (ich auch versucht, mit und ohne \n an die Nachricht angehängt wird gesendet, um zu sehen, ob es enden würde):

Relevante Client-Code-

Socket server = new Socket("127.0.0.1", 2424); 
DataOutputStream outputStream = new DataOutputStream(server.getOutputStream()); 
DataInputStream inputStream = new DataInputStream(server.getInputStream()); 
outputStream.writeInt(Protocol.Message.HANDSHAKE); 
outputStream.write('\n'); // I tried with and without this 
outputStream.flush(); 

Relevante Server-Code

ServerSocket socket = new ServerSocket(2424); 
System.out.println("Listening on port 2424"); 

while (connected) { 
    Socket client = socket.accept(); 
    System.out.println("SERVER: Going to read a message"); // This shows 
    int messageType = (new DataInputStream(client.getInputStream())).readInt(); 
    System.out.println("SERVER: Received a message (" + messageType + ")"); // This does not 
    commands.execute(messageType); 
} 

Die Nachricht, die nach readInt() gedruckt werden soll, wird nie angezeigt. Ich dachte, es wäre, da ich nur ein int senden und ein int empfangen (4 Bytes), es ist nicht so, dass ich mehr Daten als erwartet gesendet habe.

Wie soll ich das readInt() Ende machen? Muss ich ein Nullbyte oder etwas anderes senden?

EDIT: Tatsächlicher Server-Code (mit Threads).

ServerSocket socket = new ServerSocket(2424); 
System.out.println("Listening on port 2424"); 

while (connected) { 
    Socket client = socket.accept(); 
    Worker worker = new Worker(client); 
    worker.start(); 
} 

Worker-Thread

public class Worker extends Thread { 
    private final Socket client; 
    private final Commands commands; 

    private final DataOutputStream outputStream; 
    private final DataInputStream inputStream; 

    public Worker(Socket client) throws IOException { 
     System.out.println("SERVER: Handling client message"); 
     this.client = client; 

     outputStream = new DataOutputStream(client.getOutputStream()); 
     inputStream = new DataInputStream(client.getInputStream()); 

     commands = new Commands(); 
     commands.addCommand(Protocol.Message.HANDSHAKE, new HandshakeCommand()); 
     //commands.addCommand(Protocol.Message.RECEIVE_FILE, new ReceiveFileCommand()); 
    } 

    @Override 
    public void run() { 
     System.out.println("SERVER: Running thread for client message"); 
     try { 
      int messageType = inputStream.readInt(); 

      System.out.println("SERVER: Received a message (ID " + messageType + ")"); 
      commands.execute(messageType); 
     } catch (IOException | UnknownCommandException ex) { 
      System.out.println(ex); 
     } 
    } 
} 
+0

Ich habe gerade Ihren Code getestet und es funktioniert wie erwartet auf meinem Rechner. Ich habe 'outputStream.writeInt (42);' verwendet und der Server hat es mit 'SERVER empfangen: Eine Nachricht erhalten (42)'! Entweder starten Sie Ihren Server und Client nicht einmal richtig oder es gibt ein anderes Netzwerkproblem mit dem Port oder was haben Sie versucht? – xander

+0

Der Server-Code delegiert eigentlich jeden 'socket.accept()' in einen neuen Thread, aber ich denke nicht, dass das in irgendeiner Weise einen Einfluss darauf hätte? Ich gebe es noch einmal und komme mit Ergebnissen zurück. Auch jede Erklärung über die '\ n'? Muss ich das in die Nachricht aufnehmen oder nicht? –

+0

Sie müssen das '\ n' oder irgendetwas anderes nicht senden, das' DataInputStream.readInt() 'auf der Serverseite blockiert den Thread, bis 4 Bytes angekommen sind, und wandelt es dann in ein 4-Byte int um. Wahrscheinlich schickst du nie 4 Bytes an den Server-Socket. Wenn Sie zusätzlichen Thread verwenden, stellen Sie möglicherweise eine minimale Version bereit, die nicht funktioniert, da der Code aus Ihrer Frage keine Fehler enthält. Sie können es selbst ausprobieren, wenn dieser Code für Sie funktioniert. – xander

Antwort

0

Der Grund, es ist nie las, weil nichts, gesendet wurde als xander sagte. Und es war meine Schuld, dass ich nicht den tatsächlichen Client-Code, nur den Server-Code und eine minimierte Version des Client-Codes enthielt.

Ich habe versucht, die Nachricht nach der while() Schleife im Client zu senden (es wartet auch auf Nachrichten vom Server).

Die Lösung bestand darin, den hörenden Teil des Clients in einen anderen Thread zu delegieren, damit der Hauptthread, der die Nachricht an den Server senden musste, nicht blockiert wurde.