ため正しく閉まらソケットは、私は複数のクライアントが接続できるマルチスレッドサーバーを作成しようとしていると提供することができます。しかし、必要が生じた場合、リソースを適切に解放する方法についてはわかりません。Javaの:マルチスレッドサーバ
私のサーバーは入力スレッド(ユーザー入力を待っている)と進行中のスレッド(接続とユーザーを処理します)を実行します。サーバークラスでServerSocketを開き、処理スレッドに渡します。 ServerSocketを閉じるために、私は終了したい場合は、私はちょうど私のサーバークラスでこのメソッドを実行し
public class ClientConnector implements Runnable {
private ServerSocket serverSocket;
public ClientConnector(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
@Override
public void run() {
ExecutorService tcpExecutor = Executors.newCachedThreadPool();
while (!serverSocket.isClosed()) {
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("could not accept connection");
}
if (clientSocket != null) {
tcpExecutor.execute(new ClientHandler(clientSocket);
}
}
}
}
:それはこのようになります
public void exit() {
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
次serverSocket.acceptを起こす必要があります()の呼び出し例外をスローし、ソケットが閉じているのでループが停止します。
私の質問は - それを使用して作成されたClientSocketを暗黙的に閉じるServerSocketですか?または、開いているすべてのClientSocketを手作業で閉じる必要がありますか?もしそうなら、簡単な方法で、サーバーへの各接続をどこかに保存するのではなく、簡単な方法がありますか?
問題は、彼らは、クライアントからの入力を待ってブロックされているので、我々はサーバソケットを閉じる時にオープンすることが起こる任意のソケットが開いていることです。そして、それらのものは奇妙な種類のブロックであり、中断さえできません。すでに確立されているサードパーティとの接続を待っているため、ソケットのブロックを解除するための空のパケットを送信するというトリックでさえ、これらの接続で空のパケットを挿入する方法はありません。だから、あなたはこれに対する解決策を見つけましたか? –