Básicamente quiero crear un servidor sólido como una roca.Qué hacer cuando ServerSocket lanza IOException y mantiene el servidor en ejecución
while (keepRunning.get()) {
try {
Socket clientSocket = serverSocket.accept();
... spawn a new thread to handle the client ...
} catch (IOException e) {
e.printStackTrace();
// NOW WHAT?
}
}
En el bloque IOException, ¿qué hacer? ¿El socket del servidor está en falta por lo que debe ser recreado? Por ejemplo, espere unos segundos y luego
serverSocket = ServerSocketFactory.getDefault().createServerSocket(MY_PORT);
Sin embargo, si el socket del servidor todavía está bien, entonces es una lástima para cerrarla y matar a todas las conexiones previamente aceptadas que todavía se están comunicando.
EDITAR: Después de algunas respuestas, aquí mi intento de tratar con la IOException. ¿Garantizaría la implementación mantener el servidor y solo volver a crear el socket del servidor cuando sea necesario?
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);
}
}
}
}
Si crea un nuevo socket de servidor, que falla con BindException, ¿significará esto que está 100% seguro de que el antiguo socket del servidor está completamente bien? – s5804
No puedo decir "sí" con seguridad, pero en general supongo que sí. También usaría una estrategia defensiva. P.ej. si obtiene el número X de fallas llamando aceptar, entonces puede considerar que el socket del servidor está roto de alguna manera, y elegir cerrar el socket del servidor. – mdma