我有这个该死的结构:
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自行关闭?(System.exit(0))。如果 ServerSocket 在我关闭软件时继续运行只是因为我没有关闭它,那么我就有问题了,因为我无法访问那段该死的代码来关闭它:)。