gpt4 book ai didi

java - ServerSocket抛出IOException并保持服务器运行时怎么办

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:08 27 4
gpt4 key购买 nike

基本上我想创建一个坚如磐石的服务器。

while (keepRunning.get()) {
try {
Socket clientSocket = serverSocket.accept();

... spawn a new thread to handle the client ...
} catch (IOException e) {
e.printStackTrace();
// NOW WHAT?
}
}

在IOException block 中,做什么?服务器套接字是否有问题,因此需要重新创建?例如等待几秒钟,然后

serverSocket = ServerSocketFactory.getDefault().createServerSocket(MY_PORT);

但是,如果服务器套接字仍然正常,那么很遗憾关闭它并杀死所有先前接受的仍在通信的连接。

编辑:经过一些回答后,这里是我尝试处理 IOException 的尝试。该实现是否会保证保持服务器正常运行并且仅在必要时才重新创建服务器套接字?

while (keepRunning.get()) {
try {
Socket clientSocket = serverSocket.accept();

... spawn a new thread to handle the client ...
bindExceptionCounter = 0;
} catch (IOException e) {
e.printStackTrace();

recreateServerSocket();
}
}

private void recreateServerSocket() {
while (keepRunning) {
try {
logger.info("Try to re-create Server Socket");
ServerSocket socket = ServerSocketFactory.getDefault().createServerSocket(RateTableServer.RATE_EVENT_SERVER_PORT);

// No exception thrown, then use the new socket.
serverSocket = socket;
break;
} catch (BindException e) {
logger.info("BindException indicates that the server socket is still good.", e);
bindExceptionCounter++;

if (bindExceptionCounter < 5) {
break;
}
} catch (IOException e) {
logger.warn("Problem to re-create Server Socket", e);
e.printStackTrace();

try {
Thread.sleep(30000);
} catch (InterruptedException ie) {
logger.warn(ie);
}
}
}
}

最佳答案

如果有疑问,您可以尝试使用相同的端口重新创建服务器套接字。如果套接字已经关闭,那么创建就会成功,你可以继续处理新的连接。旧的连接已经消失,但由于套接字已关闭,所以这不在您的控制范围内。如果套接字未关闭,则创建新实例将失败,因为端口仍在使用中,您可以忽略它 - 即不要替换当前服务器套接字引用。

一般来说,客户端还应该假定连接会中断并且需要重新连接。换句话说,不仅仅是服务器必须稳健——客户端还应该预见到连接错误并重新连接。

关于java - ServerSocket抛出IOException并保持服务器运行时怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028543/

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