Я думал, что когда клиент ожидает Java-объекта от сервера с помощью readObject, если сервер выключится, это вызовет исключение IOException на клиенте. Но этого не происходит, даже если сервер умирает, клиент не знает об этом и продолжает бесконечно ждать readObject.
Если такое поведение нормально, я бы хотел, чтобы какой-нибудь эксперт сказал мне, есть ли проблема способ моделирования, зная, когда сервер умер, чтобы я мог повторно подключиться к нему, когда он оживет.
Если смерть сервера вызывает исключение на клиенте, я хотел бы помочь выяснить, почему я не получаю это поведение (я собираюсь сумасшедший).
Я оставляю код ниже. Спасибо.
@Override
public void run(){
QueryCommunicationObject qcoRecibido;
while(true){
try {
qcoRecibido=(QueryCommunicationObject) SmartSecretary.getSocketAltasOis().readObject();
// Comprobamos que está correctamente firmado
if( SmartSecretary.getFirmaPublicaAltas().comprobar(QueryCommunicationObject.qcoToByteArrayPreSignature(qcoRecibido), qcoRecibido.getSignedHash()) ){
// Comprobamos que nos envía el QCO el servidor de altas
if(Arrays.equals(qcoRecibido.getDireccionOrigen(),SmartSecretary.getDireccionPublicaAltas())){
if(qcoRecibido.getTipo()==8){ //
SmartSecretary.getDireccionesAutorizadas().add(new OriginAddressWrapper(qcoRecibido.getDocumento()));
}else if(qcoRecibido.getTipo()==7){ // Eliminación de usuario autorizado
// Eliminamos al usuario
// en Documento mapeamos la direccion origen a ser eliminada
SmartSecretary.getDireccionesAutorizadas().remove(new OriginAddressWrapper(qcoRecibido.getDocumento()));
}else{
System.out.println("$$$$$$ Recibido QCO Indebido con servidor de altas, Tipo:"+qcoRecibido.getTipo());
}else{
logger.log(Level.INFO, "$$$$$$ SecretaryAltasQCOListener: ServidoRecibido QCO bien firmado pero desde una IP distinta al servidor de altas");
}
}else{ // Si recibimos un QCO mal firmado
System.out.println("$$$$$$ QCO con el ACK Mal firmado por Servidor de altas:");
}
} catch (IOException ex) {
logger.log(Level.SEVERE, "$$$$$$ Error IO de en socket con el Servidor de Altas:"+ex.getMessage());
// Iniciamos la reconexión
try {
SmartSecretary.getSocketAltas().close();
} catch (Exception ex1) {
logger.log(Level.SEVERE, "$$$$$$ Se cierra el hilo por error de I/O con el servidor de Altas:"+ex1.getMessage());
}
// Necesaria por si somos llamados ante una reconexión, evitamos que antes de acabar de ejecutarnos otros posibles threads intenten
// enviar por un socket que no existe
SmartSecretary.setSocketAltas(null);
new SecretaryAltasIniciateCommunication().start();
System.out.println("$$$$$$ SecretaryAltasIniciateCommunication: CREAMOS UNA NUEVA INSTANCIA PARA RECONECTAR desde SecretaryAltasQCOListener");
// Dejamos que termine el hilo
break;
} catch (ClassNotFoundException ex) {
logger.log(Level.SEVERE, "$$$$$$ No se ha recibido un objeto QCO válido, desde el Servidor de Altas:"+ex.getMessage());
} catch (Exception ex){ // Añadida porque en pruebas me dio una excepción RuntimeException en teoría corregida por Oracle. Tambien una
// NullPointerException
logger.log(Level.SEVERE, "$$$$$$ SecretaryAltasIniciateCommunication: Ha llegado excepci\u00f3n no capturada. Mensaje:"+ ex.getMessage());
}
}
System.out.println("$$$$$$ SecretaryAltasQCOLIsterner: I DIE:");
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... sed-by-the
ReadObject() не генерирует исключение, когда сокет внезапно закрывается удаленным сервером. Это нормально? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение