В основном я хочу создать надежный сервер.
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);
}
}
}
}