繁体   English   中英

Java:正确关闭多线程服务器的套接字

[英]Java: properly closing sockets for multi threaded servers

我正在尝试创建一个多线程服务器,多个客户端可以连接到该服务器并可以为其提供服务。 但是,如果需要,我不确定如何正确释放我的资源。

我的服务器运行一个输入线程(等待用户输入)和一个处理线程(处理连接和用户)。 我在服务器类中打开一个 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 是否会隐式关闭使用它创建的 ClientSockets?

不,这对他们没有影响。

或者我应该确保手动关闭每个打开的 ClientSocket?

是的,无论如何您都应该在每个处理程序线程中这样做。

如果是这样,是否有一种简单的方法可以做到而不是将与服务器的每个连接都保存在某处?

只需施加读取超时并关闭超时的每个套接字。 这是任何服务器的正常部分。 您不必收集套接字或对其采取任何特殊措施来关闭。

不,它没有。 它只是关闭ServerSocket意味着无法建立新连接。 现有的开放套接字仍将继续工作。

没有“简单”的方法可以关闭所有打开的套接字,因为开始并不难(或者,如果您发现这是网络编程中的难点,那么会发生一些非常奇怪的事情)。

让客户端处理程序线程在处理结束时关闭客户端套接字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM