Zasadniczo chcę stworzyć solidny serwer.Co zrobić, gdy ServerSocket zgłasza wyjątek IOException i utrzymuje serwer?
while (keepRunning.get()) {
try {
Socket clientSocket = serverSocket.accept();
... spawn a new thread to handle the client ...
} catch (IOException e) {
e.printStackTrace();
// NOW WHAT?
}
}
W bloku IOException, co zrobić? Czy serwer jest uszkodzony i trzeba go odtworzyć? Na przykład poczekać kilka sekund, a następnie
serverSocket = ServerSocketFactory.getDefault().createServerSocket(MY_PORT);
Jednak jeśli gniazdo serwera jest jeszcze OK, to szkoda, aby zamknąć go i zabić wszystkich uprzednio zaakceptowane połączenia, które są nadal komunikować.
EDYCJA: Po kilku odpowiedziach, oto moja próba radzenia sobie z wyjątkiem IOException. Czy wdrożenie gwarantowałoby utrzymanie serwera i ponowne utworzenie gniazda serwera tylko wtedy, gdy jest to konieczne?
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);
}
}
}
}
Jeśli tworzenie nowego gniazda serwera, które kończy się niepowodzeniem z BindException - oznaczałoby to, że jest w 100% pewność, że stare gniazdo serwera jest w pełni poprawne? – s5804
Nie mogę powiedzieć "tak" na pewno, ale ogólnie zakładam, że. Używałbym też strategii obronnej. Na przykład. jeśli otrzymasz X liczbę niepowodzeń wywoływania accept, możesz rozważyć uszkodzenie gniazda serwera i zamknąć gniazdo serwera. – mdma