Я думал, что когда клиент ожидает 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
Программисты JAVA общаются здесь
1734527738
Anonymous
Я думал, что когда клиент ожидает Java-объекта от сервера с помощью [b]readObject[/b], если сервер выключится, это вызовет исключение 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:");
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79291034/readobject-does-not-throw-exception-when-the-socket-is-abruptly-closed-by-the[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия