gpt4 book ai didi

java - ServerSocket - 真的有必要关闭它吗?

转载 作者:搜寻专家 更新时间:2023-10-30 21:44:34 25 4
gpt4 key购买 nike

我有这个该死的结构:

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 在我关闭软件时继续运行只是因为我没有关闭它,那么我就有问题了,因为我无法访问那该死的代码来关闭它:)。

最佳答案

是的。虽然销毁对套接字的引用可能会导致垃圾收集器最终确定它,但这并没有指定它将被关闭。在许多情况下,这是特定于实现的,并且有时会由于性能甚至难以跟踪的微小错误而偏离设计。

任何地方保留引用是一个肯定的赌注,即使使用弱引用也是如此。

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

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

永远不要依赖 OS/JVM 行为或终结来关闭您的套接字,尤其是当您有多个套接字时,即使您不打算使用所有套接字他们同时。

关于java - ServerSocket - 真的有必要关闭它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17385452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com