基本上我想创建一个坚如磐石的服务器。当ServerSocket抛出IOException并保持服务器运行时该怎么办
while (keepRunning.get()) {
try {
Socket clientSocket = serverSocket.accept();
... spawn a new thread to handle the client ...
} catch (IOException e) {
e.printStackTrace();
// NOW WHAT?
}
}
在IOException块中,该怎么办?服务器套接字是否有问题需要重新创建?例如等待几秒钟,然后
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);
}
}
}
}
如果创建一个新的服务器套接字(该套接字由于BindException而失败) - 这是否意味着100%确定旧服务器套接字完全正常? – s5804 2010-06-12 11:59:55
我不能肯定地说“是”,但总的来说,我会假设。我也会使用防守策略。例如。如果您接到X个失败的呼叫,那么您可能会认为服务器套接字不知何故中断,并选择关闭服务器套接字。 – mdma 2010-06-12 12:38:41