Java:正确关闭多线程服务器的套接字
我正在尝试创建一个多线程服务器,多个客户端可以连接到该服务器,并可以为其提供服务。然而,我不确定在需要时如何适当地释放我的资源 我的服务器运行一个输入线程(等待用户输入)和一个复制线程(处理连接和用户)。我在server类中打开一个ServerSocket并将其传递给我的处理线程。看起来是这样的:Java:正确关闭多线程服务器的套接字,java,sockets,tcp,distributed-system,Java,Sockets,Tcp,Distributed System,我正在尝试创建一个多线程服务器,多个客户端可以连接到该服务器,并可以为其提供服务。然而,我不确定在需要时如何适当地释放我的资源 我的服务器运行一个输入线程(等待用户输入)和一个复制线程(处理连接和用户)。我在server类中打开一个ServerSocket并将其传递给我的处理线程。看起来是这样的: public class ClientConnector implements Runnable { private ServerSocket serverSocket; public Clien
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?或者我应该确保手动关闭每个打开的客户端插座吗?如果是这样的话,有没有一种简单的方法来代替将与服务器的每一个连接都保存到某个地方呢?没有。它只是关闭了
ServerSocket
,意味着无法建立新的连接。现有的开放式插座仍将继续工作
没有“简单”的方法来关闭所有打开的套接字,因为一开始并不难(或者如果你发现这是网络编程中的一个困难部分,那么会发生一些非常奇怪的事情)
关闭ServerSocket是否会隐式关闭使用它创建的ClientSocket
不,这对他们没有影响
或者我应该确保手动关闭每个打开的客户端插座吗
是的,无论如何,在每个处理程序线程中都应该这样做
如果是这样的话,有没有一种简单的方法来代替将每个与服务器的连接保存到某个地方
只需施加读取超时并关闭超时的每个套接字。这是任何服务器的正常部分。您不必收集套接字或对其采取任何特殊的关闭措施。让客户端处理程序线程,在处理结束时关闭客户端套接字。问题是,在我们关闭服务器套接字时恰好打开的任何套接字都是打开的,因为它们在等待客户端输入时被阻止。而他们的是一种奇怪的阻塞,甚至不能被中断。即使发送一个空数据包来解锁套接字的技巧也不起作用,因为他们正在等待与第三方建立的连接,所以您无法在这些连接中插入一个空数据包。那么,你找到解决办法了吗?