例hereに基づいて、byeが送信されると、単純ソケットサーバークライアントが終了します。以下のコードでは、スレッドベースのアプローチを使用して複数のクライアントを受け入れますが、クライアントハンドリングを正常に処理することはできません。nullを繰り返してエラーを処理します。正常に終了するソケットスレッド
上記のリンクの最初の例は、クライアントとサーバーを終了させます。以下のサーバーコードには、「.bye」が受信されたときに切断する手段はありません。私はクライアントが正常にサーバーから切断することを望みます。クライアントから ".bye"を受信すると、サーバーは接続を閉じる必要があります。これはChatServerThreadのSystem.out.println(streamIn.readUTF());
で処理する必要があると思いますか?元のコードの履歴を参照し、解答へのフィードバックを反映するように更新
質問:
import java.net.*;
import java.io.*;
public class ChatServerThread implements Runnable
//public class ChatServerThread extends Thread
{ private Socket socket = null;
private ChatServer server = null;
private int ID = -1;
private DataInputStream streamIn = null;
private DataOutputStream streamOut = null;
public ChatServerThread(ChatServer _server, Socket _socket)
{ server = _server; socket = _socket; ID = socket.getPort();
}
public void run() {
try {
handleClient();
} catch(EOFException eof) {
System.out.println("Client closed the connection.");
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
public void handleClient() throws IOException {
boolean done = false;
try {
System.out.println("Server Thread " + ID + " running.");
while (!done) {
String nextCommand = streamIn.readUTF();
if(nextCommand.equals(".bye")) {
done = true;
} else {
System.out.println(nextCommand);
}
}
} finally {
streamIn.close();
streamOut.close();
socket.close();
}
}
public void open() throws IOException
{
streamIn = new DataInputStream(new BufferedInputStream(socket.getInputStre
am()));
streamOut = new DataOutputStream(new BufferedOutputStream(socket.getOutput
Stream()));
}
public void close() throws IOException
{ if (socket != null) socket.close();
if (streamIn != null) streamIn.close();
if (streamOut != null) streamOut.close();
}
}
最初のエラーがimplements Runnable
によるものです。 2番目はjava.io.*
がインポートされているのでわからないので、なぜそれが不平を言うのか分かりません。クライアントはさようならと言ったので
ChatServer.java:34: error: cannot find symbol
client.start();
^
symbol: method start()
location: variable client of type ChatServerThread
ここで、ChatServerクラスのスレッドインスタンスをnullに設定していますか?クライアント接続を受け入れるコードserverSocket.accept()はループしています。あなたはクライアントの数に等しい固定回数だけループを実行する必要があります。あなたの場合、プログラムはserverSocket.accept()呼び出しでブロックされます。あなたがこのケースを処理する場合、残りのものは機能するはずです。 – JProgrammer
@JProgrammerオリジナルの質問を明確にしました。サーバーが 'readUTF'と一致するステートメントを受け取った後、クライアントを正常に切断しようとしています。無関係な例は含めてはいけません。 – Astron