私の単純な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);
}
}
}
私はちょうどあなたのコードをテストし、私のマシン上で期待どおりに動作します。私は 'outputStream.writeInt(42);'を使い、サーバは 'SERVER:メッセージを受け取った(42)'とそれを受け取った!だからあなたはあなたのサーバーとクライアントを正しく起動しないでください、あるいはポートに何か別のネットワーク問題があるのですか、何を試しましたか? – xander
サーバコードは実際にはそれぞれの 'socket.accept()'を新しいスレッドに委譲しますが、それは何らかの影響を与えるとは思わないでしょうか?私はもう一度行って結果を返すよ。 また、 '\ n'についての説明はありますか?それをメッセージに含める必要がありますか? –
'\ n'など何も送信する必要はありません。サーバー側の' DataInputStream.readInt() 'は、4バイトが到着するまでスレッドをブロックし、4バイトのintに変換します。したがって、サーバーソケットに4バイトを送信することはほとんどありません。余分なスレッドを使用する場合、おそらく動作しない最小限のバージョンを提供します。質問のコードにエラーがないため、そのコードがうまく動作すれば自分で試すことができます。 – xander