-1

私の単純なJavaクライアント/サーバプログラムでは、サーバにメッセージを送信してそこにあるメッセージを読むと、readInt()が無期限に読み込まれ、プログラムがそこにスティックされます。サーバソケットはJavaでクライアントメッセージを無期限に読み取ります

あなたは、コード(私もしてみましたし、それが終わるだろうかどうかを確認するために送信されたメッセージに\nを追加せず)によって言うことができるように、私は、何も、私はint型の送受信たことを確認したん:

関連するクライアントコード

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

関連するサーバコード

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

readInt()の後に出力するメッセージは表示されません。私はintを送信してint(4バイト)を受け取って以来、それは思ったよりも、私は予想以上のデータを送っていたのではない。

readInt()を終了するにはどうすればよいですか? nullバイトなどを送信する必要がありますか?

EDIT:実サーバコード(スレッドを使用)。

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

ワーカースレッド

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

私はちょうどあなたのコードをテストし、私のマシン上で期待どおりに動作します。私は 'outputStream.writeInt(42);'を使い、サーバは 'SERVER:メッセージを受け取った(42)'とそれを受け取った!だからあなたはあなたのサーバーとクライアントを正しく起動しないでください、あるいはポートに何か別のネットワーク問題があるのですか、何を試しましたか? – xander

+0

サーバコードは実際にはそれぞれの 'socket.accept()'を新しいスレッドに委譲しますが、それは何らかの影響を与えるとは思わないでしょうか?私はもう一度行って結果を返すよ。 また、 '\ n'についての説明はありますか?それをメッセージに含める必要がありますか? –

+0

'\ n'など何も送信する必要はありません。サーバー側の' DataInputStream.readInt() 'は、4バイトが到着するまでスレッドをブロックし、4バイトのintに変換します。したがって、サーバーソケットに4バイトを送信することはほとんどありません。余分なスレッドを使用する場合、おそらく動作しない最小限のバージョンを提供します。質問のコードにエラーがないため、そのコードがうまく動作すれば自分で試すことができます。 – xander

答えて

0

xanderが言ったように何も、送信されていないされていたので、それは読んでいませんでした理由があります。 そして、私は実際のクライアントコード、サーバーコード、およびクライアントコードの最小化バージョンを含めなかったのは私のせいでした。

クライアントのwhile()ループの後にメッセージを送信しようとしました(サーバーからのメッセージも待機しています)。

解決策は、クライアントのリスニングパートを別のスレッドに委任して、サーバーにメッセージを送信するために必要なメインスレッドをブロックしないようにすることでした。

関連する問題