我正在尝试创建一个多线程服务器,多个客户端可以连接并得到服务。但是,如果需要,我不确定如何正确释放我的资源。
我的服务器运行一个输入线程(等待用户输入)和一个处理线程(处理连接和用户)。在服务器类中打开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);
}
}
}
}
如果我想退出,只需在我的服务器类中运行此方法来关闭ServerSocket:
public void exit() {
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这将导致下一个serverSocket.accept()调用抛出异常,循环停止,因为套接字已关闭。
我的问题是 - 关闭ServerSocket是否会隐式关闭使用它创建的ClientSocket?还是我应该手动关闭每个打开的ClientSocket?如果是这样,是否有一种简单的方法来做到这一点,而不是在服务器上保存每个连接?