我有这个该死的结构:
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即使使用 WeakReferences,我打赌也不会。
现在,操作系统可以提供的套接字数量有限(由于其设计)。当您打开越来越多的套接字时,操作系统会承受压力并最终耗尽套接字,从而导致 Java 或其他程序失败。此外,根据您或默认设置的套接字选项,此套接字可能会发送保持活动,从而耗尽其他端点上的资源。
退出时,它通过套接字在其构造函数中注册关闭操作来关闭它,和/或操作系统的自动清理来关闭它。
你应该never依靠操作系统/JVM 行为或终结来关闭套接字,特别是如果您有多个套接字,即使您不打算同时使用所有套接字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)