因此,我正在爲IRC服務器,並且我添加了一個配置屏幕,您可以在其中編輯它正在使用的端口,但我必須重新調整Listen
類效果,所以我有這個在我的配置類:Java - 重新加載類時關閉套接字
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()
如果端口是相同的,因爲這是在港口使用。
這麼久以來,我怎麼才能重新教育班級和使用新的端口之前關閉插座?
下面是完整的例外是trows:
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)
是否拋出任何異常?它需要多長時間? – 2013-03-12 19:53:59
它不是拖延異常,它只是掛起,過了一段時間,我只是強制關閉應用程序在任務管理器 – Snakybo 2013-03-12 19:55:48
它看起來像你試圖關閉同一個套接字兩次?您的finally塊會關閉套接字,如果您在此之後調用closePorts,可能會導致問題。 – Max 2013-03-12 19:56:08