Member 13337752 Ответов: 1

Есть ли какая-то разница между этими двумя реализациями сокетов?


Я сделал клиент-серверное приложение с использованием TCP-сокетов, но клиенты тоже застряли часто и они бросают "Время ожидания соединения истекло"во время чтения новых сообщений с сервера.
В обоих приложениях я использую это:
try{
   do{
     message=(String) input.readLine();

     System.out.println(message);

   }while(!message.equals("Disconnect"));
 }catch (IOException e) {
    System.out.println(e.getMessage());
 }

Но на примерах, которые я видел, они делают это:
do{
  try{
     message=(String) input.readLine();

     System.out.println(message);

  }catch (IOException e) {
     System.out.println(e.getMessage());
  }
}while(!message.equals("Disconnect"));


Есть ли какая-то существенная разница в использовании "try" из "do{}while", чем использование "try" внутри " do{}while"?

Что я уже пробовал:

До сих пор я тестировал оба способа, но мне не удалось воссоздать ошибку.

Jochen Arndt

Большой разницы нет, но второй-это обычный вариант (ловить исключения для той части кода, которая может выбросить).

Однако в вашем примере второй вариант не покинет цикл при ошибках, в то время как первый это сделает.

Но это не имеет никакого отношения к ошибкам тайм-аута сети. Решение этих проблем требует знания того, как работает ваша коммуникация.

1 Ответов

Рейтинг:
10

Thomas Daniels

Да, разница есть.

В первом блоке кода, когда есть ошибка в try блок, вы выходите из цикла do-while и входите в него. catch. readLine больше не вызывается, потому что код, который идет после блока catch, теперь выполняется.

Во втором блоке кода, когда в try блок, вы не выходите из цикла do-while (потому что try-catch находится внутри цикла). Итак, в случае ошибки, после кода в catch выполняется, цикл продолжает выполняться и readLine его снова казнят.


Member 13337752

Может быть, это и есть причина ошибки "тайм-аут соединения", которая так часто появляется?

Thomas Daniels

Нет. Единственная практическая разница заключается в том, будет ли клиент продолжать чтение после ошибки.