gpt4 book ai didi

Java - 重新加载类时关闭套接字

转载 作者:太空宇宙 更新时间:2023-11-04 07:45:24 25 4
gpt4 key购买 nike

所以我正在为 IRC 开发服务器,我添加了一个配置屏幕,您可以在其中编辑它正在使用的端口,但我必须重新初始化 Listen 类才能使其生效,所以我在我的 Config 类中添加了以下内容:

Listen.closePorts();
new Listen();

这是我的听课:

package server.network;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

import server.Server;
import server.gui.GUIMain;

public class Listen {
private static Socket socket = null;
private int port;

public Listen() {
try {
port = Server.listenPort;
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(port);
GUIMain.jta.append("\nServer Started and listening for messages on port " + port + ".\n");

while(true) {
socket = serverSocket.accept();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String msg = br.readLine();
GUIMain.jta.append("Received message from client: " + msg + "\n");
}
} catch (Exception e) {
GUIMain.jta.append("Port " + port + " already in use!\n");
} finally {
try {
socket.close();
} catch(Exception e) { }
}
}

public static void closePorts() {
try {
socket.close();
GUIMain.jta.append("Server closed\n");
} catch (IOException e) { }
}
}

当我启动应用程序时,它运行此类,打开指定端口的套接字,但是当我尝试在此处关闭端口时:

public static void closePorts() {
try {
socket.close();
GUIMain.jta.append("Server closed\n");
} catch (IOException e) { }
}

它卡在socket.close();

如果我注释掉 Listen.closePorts(); 并尝试重新加载该类并使套接字保持打开状态,如果端口与正在使用的端口相同,则它会挂起或运行 catch()

长话短说,如何在重新安装类并使用新端口之前关闭套接字?

这是它引发的完整异常:

java.lang.NullPointerException
at server.network.Listen.closePorts(Listen.java:44)
at server.gui.GUISettings.actionPerformed(GUISettings.java:86)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

不提供直接的解决方案,但不会引发异常,因为您的代码正在吞噬它们。空的 catch block 从来都不是好的做法。至少,使用 e.printStackTrace() 打印捕获的异常的堆栈跟踪

关于Java - 重新加载类时关闭套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15370791/

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