我正在用JavaFX编写一个邮箱应用程序,使用MVC架构. 服务器的启动方法是这样的.
@Override
public void run() {
try {
serverSocket = new ServerSocket(PORT);
controller.logEvent(Protocol.SERVER_STARTED, true, null, null);
loadAccounts();
while (isRunning.get()) {
try {
Socket socket = serverSocket.accept();
if (isRunning.get()) {
connectedClients.add(socket);
Thread thread = new Thread(() -> {
handleClient(socket);
connectedClients.remove(socket);
});
thread.start();
} else {
socket.close();
}
} catch (SocketException e) {
if (!isRunning.get()) {
break;
} else {
throw e;
}
}
}
} catch (IOException e) {
controller.logEvent(Protocol.SERVER_STARTED, false, null, null);
e.printStackTrace();
}
}
而要停止服务器的是这样的:
public void stopServer() {
isRunning.set(false);
try {
if (serverSocket != null) {
serverSocket.setReuseAddress(true);
serverSocket.close();
controller.logEvent(Protocol.SERVER_STOPPED, true, null, null);
for (Socket socket : connectedClients) {
socket.close();
}
connectedClients.clear();
}
} catch (IOException e) {
controller.logEvent(Protocol.SERVER_STOPPED, false, null, null);
e.printStackTrace();
}
}
我的问题是服务器重启.当我试图重新启动它时,它会给我以下错误:
java.net.BindException: Address already in use (Bind failed)
at java.base/java.net.PlainSocketImpl.socketBind(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:452)
at java.base/java.net.ServerSocket.bind(ServerSocket.java:395)
at java.base/java.net.ServerSocket.<init>(ServerSocket.java:257)
at java.base/java.net.ServerSocket.<init>(ServerSocket.java:149)
at MailServer.run(MailServer.java:71)
at java.base/java.lang.Thread.run(Thread.java:829)
我重新启动服务器的方法如下:
public void startServer() {
try {
if (serverSocket != null && !serverSocket.isClosed()) {
serverSocket.setReuseAddress(true);
serverSocket.close();
}
isRunning.set(true);
serverSocket = new ServerSocket(PORT);
Thread thread = new Thread(this);
thread.start();
controller.logEvent(Protocol.SERVER_STARTED, true, null, null);
} catch (IOException e) {
controller.logEvent(Protocol.SERVER_STARTED, false, null, null);
}
}
你有什么建议来解决我的问题吗?我发现问题在于服务器停止时端口没有被释放,但我不知道如何修复它.