接続されたクライアントごとに個別のスレッドを作成するマルチスレッド チャット サーバーを作成しています。クライアントが接続するたびに、サーバーはクライアント ハンドラー クラスの新しいインスタンスを作成します。これは、その特定のクライアントとの間で送受信されるメッセージを追跡することになっています。
クライアントが初めてエコー サーバーに接続すると、サーバーはクライアントの応答のエコーで応答します。しかし、もう一度サーバーにメッセージを送信しようとすると、クライアントは IOException を作成します。私は自分でクライアント アプリケーションを作成しましたが、他のサーバーと正常に通信できるため、動作することはわかっています。問題はこのクライアント ハンドラ クラスの run メソッドのどこかにあると確信していますが、なぜ機能しないのかわかりません。クライアント ハンドラ クラスの run メソッドは次のとおりです。
public void run() {
try (
BufferedReader in =
new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream());
) {
long time = System.currentTimeMillis();
out.println("Server - " + time + ": " + in.readLine());
out.close();
try {
in.close();
} catch (IOException e) {
System.err.println("Couldn't close input stream");
}
} catch(IOException e) {
System.err.println("Got an IOException error while reading or writing from/to client");
}
}
どこかに何らかの while ループがあるはずだと推測しましたが、これを実装しようとする試みはすべて失敗しました。たとえば、このコードを変更しようとしました:
long time = System.currentTimeMillis();
out.println("Server - " + time + ": " + in.readLine());
これに:
String inputLine;
while((inputLine = in.readLine()) != null) {
long time = System.currentTimeMillis();
out.println("Server - " + time + ": " + inputLine);
}
このソリューションは、オラクル サイト ( http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html ) で説明されている方法のコピーです。
主な問題は、サーバー/クライアント通信の概念全体を実際に把握していないことにあると思うので、正しい方向へのプッシュは大歓迎です.
前もって感謝します!