ServerSocket - 真的有必要 close() 它吗?

2024-01-26

我有这个该死的结构:

public void run() {

        try {
            if (!portField.getText().equals("")) {              
                String p = portField.getText();
                CharSequence numbers = "0123456789";

            btnRun.setEnabled(false);

            if (p.contains(numbers)) {
                ServerSocket listener = new ServerSocket(Integer.parseInt(p));

                while (true) {
                    Socket socket = listener.accept();
                    try {
                        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                        out.println("Hi there, human.");    
                    } finally {
                        socket.close(); 
                    }
                }} else {
                    JOptionPane.showMessageDialog(null, "Only numbers are allowed.");
                }
            }

        } catch (NumberFormatException | HeadlessException | IOException e) {
            e.printStackTrace();
        } 
    }

正如您所看到的,我需要像关闭套接字一样关闭侦听器。问题是,如果我尝试在循环后这样做,代码将“无法访问”,并且如果我尝试在 ServerSocket 的任何位置声明一个字段,我会收到 NullPointerException。我不想将 ServerSocket 与套接字/客户端一起关闭,因为我想建立新连接。

这就是我的问题:

在这种情况下真的有必要关闭 ServerSocket 吗?软件关闭时ServerSocket会自行关闭?(系统退出(0))。如果当我关闭软件时 ServerSocket 继续运行,只是因为我没有关闭它,那么我就有问题了,因为我无法到达那段该死的代码来关闭它:)。


是的。销毁对套接字的引用时may导致垃圾收集器完成它,但这并不指定它将被关闭。在许多情况下,这是特定于实现的,并且有时可能由于性能甚至难以跟踪的微小错误而导致设计脱轨。

保留参考anywhere is a sure即使使用 Wea​​kReferences,我打赌也不会。

现在,操作系统可以提供的套接字数量有限(由于其设计)。当您打开越来越多的套接字时,操作系统会承受压力并最终耗尽套接字,从而导致 Java 或其他程序失败。此外,根据您或默认设置的套接字选项,此套接字可能会发送保持活动,从而耗尽其他端点上的资源。

退出时,它通过套接字在其构造函数中注册关闭操作来关闭它,和/或操作系统的自动清理来关闭它。

你应该never依靠操作系统/JVM 行为或终结来关闭套接字,特别是如果您有多个套接字,即使您不打算同时使用所有套接字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ServerSocket - 真的有必要 close() 它吗? 的相关文章

随机推荐