0

У меня есть код, похожий на приведенный ниже код. Проблема, с которой я сталкиваюсь, заключается в том, что когда ObjectInputStream (входная переменная) пытается прочитать объект (что произойдет только после установления соединения), он сбой и дает мне ошибку:Чтение данных с клиента с использованием ObjectInputStream и ObjectOutputStream, подключенных к клиенту

java.net .SocketException: Соединение сброса

и относится к линии с:

сообщение = (строка) input.readObject();

Он входит в цикл исключения ex, когда он должен идти туда, если клиент отключается (насколько мне известно).

@Override 
    public void run() { 

     String message = ""; 

     do{ 
      try{ 
       message = (String) input.readObject(); 
      }catch(ClassNotFoundException cnfException){ 
       System.err.println("Unable to read client data."); 
      }catch(Exception ex){ // Will get called if the client is no longer in communication with the server. 
       continueTalking = false; // If the client disconnects, the server will shut down its communication with the client. 
       ex.printStackTrace(); 
       break; // Breaks out of the do...while loop. 
      } 

      if(message.equals("DISCONNECT")){ 
       continueTalking = false; 
       System.out.println(connection.getLocalAddress() + " disconnected from the session."); 
      } 
      else{ 
       //TODO Send the message off to be processed. 
      } 
     }while(continueTalking); // Continues waiting for a message until continueTalking = false 

     closeStreams(); 
    } 

Спасибо!

ОБНОВЛЕНИЕ: Я понял. Сначала я попробовал EOFException, но по какой-то причине это никогда не называлось. В конце концов я узнал, что с моей клиентской стороной возникла проблема в том, что она фактически не отправляла никаких данных и не отключилась, как только она запустилась. Для тех, кто испытывает такую ​​же проблему, как и я, вот мой фиксированный код:

/** This should handle the connection **/ 
    @Override 
    public void run() { 

     /** The message that the client has sent to the server. **/ 
     String message = ""; 

     do{ 
      try{ 
       message = (String) input.readObject(); // Waits for the client to send a message to the server. 
      }catch(ClassNotFoundException cnfException){ 
       System.err.println("Unable to read client data. Continuing on with my life."); 
      }catch(Exception noConnectionToSocketFound){ // Will get called if the client is no longer in communication with the server. 
       System.out.printf("User with handle: %s disconnected.\n", clientIP); 
       continueTalking = false; // If the client disconnects, the server will shut down its communication with the client. 
       break; // Breaks out of the do...while loop that is constantly waiting for the client to send a message to. 
      } 

      /** If the client sends the message "DISCONNECT", then the server will shut down all communications with said client. **/ 
      if(message.equals("DISCONNECT")){ 
       System.out.println(connection.getLocalAddress() + " disconnected from the session properly."); 
       continueTalking = false; // If the client wants to disconnect, then the server will stop trying to communication with said client. 
       break; // Breaks out of the do...while loop that is constantly waiting for the client to send a message to. 
      } 
      else if(message != ""){ 
       System.out.printf("Got message from %s:\n%s\n", clientIP, message); 
       message = ""; // Is needed so that this loop doesn't get called every time after the first message has been sent. Without it, after the word "cheeseburger" is sent, it would continually think that "cheeseburger" is being repeatedly sent (this might not actually happen anymore). 
       //TODO Send the message off to be processed. 
      } 

     }while(continueTalking); // Continues waiting for a message until continueTalking = false 

     closeStreams(); // Just some clean up 

continueTalking = false; 
break; 

может быть немного излишним и ненужным (я бы только действительно нужен один из них), но я чувствуйте себя лучше, зная, что есть две вещи, на которые можно вернуться.

Надеюсь, это поможет!

+1

* «У меня есть код, похожий на приведенный ниже код» * Для более эффективной помощи, отправьте сообщение [SSCCE] (http://sscce.org/). –

+0

'catch (Исключение noConnectionToSocketFound) {// Будет вызван, если клиент больше не связывается с сервером': Это вводящий в заблуждение комментарий к плохой части кода. Вы должны поймать 'EOFException' отдельно, зарегистрировать его и закрыть соединение; и тогда вы должны поймать 'IOException ', что довольно точно соответствует вашему комментарию по этой строке кода. Поймать «Исключение» - это, как правило, плохая практика. – EJP

+0

@ EJP Я попробовал то, что вы сказали, но даже когда клиент отключился, он так и не получил вызов. Если бы вы могли прояснить, как я буду реализовывать это для работы, это было бы очень полезно, потому что я просто не мог понять это. –

ответ

0

«Сброс соединения» имеет много возможных причин, но наиболее распространенным является то, что вы написали соединение, которое уже было закрыто одноранговым узлом: другими словами, ошибка протокола приложения.

Ваша петля должна улавливать EOFException отдельно и относиться к ней как к упорядоченному закрытию.

Смежные вопросы