我正在尝试创建一个多线程服务器,多个客户端可以连接并提供服务。但是,我不确定在需要时如何正确释放我的资源。
我的服务器运行一个输入线程(等待用户输入)和一个处理线程(处理连接和用户)。我在服务器类中打开一个 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 是否会隐式关闭使用它创建的 ClientSockets?或者我应该确保手动关闭每个打开的 ClientSocket?如果是这样,是否有一种简单的方法可以做到这一点,而不是保存与服务器的每个连接?
关闭 ServerSocket 是否会隐式关闭使用它创建的 ClientSocket?
不,这对他们没有影响。
或者我应该确保手动关闭每个打开的 ClientSocket?
是的,无论如何你都应该在每个处理程序线程中这样做。
如果是这样,是否有一种简单的方法可以做到这一点,而不是保存与服务器的每个连接?
只需施加读取超时并关闭每个超时的套接字即可。这是任何服务器的正常部分。您不必收集套接字或对它们采取任何特殊措施来关闭它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)