0

아래 코드와 비슷한 코드가 있습니다. 내가 가지고있는 문제는 ObjectInputStream (입력 변수)이 (연결이 설정된 후에 만 ​​발생하는) 객체를 읽으려고 할 때 충돌이 발생하고 오류가 발생한다는 것입니다.클라이언트에 연결된 ObjectInputStream 및 ObjectOutputStream을 사용하여 클라이언트에서 데이터 읽기

java.net .SocketException : 연결

를 재설정하고있는 라인을 의미한다 : = (문자열) input.readObject()

메시지;

클라이언트가 연결을 끊을 경우에만 예외 루프가 진행됩니다 (지금까지 내가 알고있는 것처럼).

@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(); 
    } 

고맙습니다!

UPDATE : 나는 그것을 알아 냈어. 원래 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; 

가 (난 단지 정말 그들 중 하나를 필요) 약간의 중복 및 불필요한 될 수도 있지만 I : 저와 같은 문제가 발생하는 누군가를 위해, 여기 내 고정 코드 다시 떨어질 두 가지가 있다는 것을 잘 알고 있습니다.

희망이 도움이됩니다.

+1

* "아래 코드와 비슷한 코드가 있습니다."* 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

'catch (Exception noConnectionToSocketFound) {// 클라이언트가 더 이상 서버와 통신하지 않는 경우 호출됩니다 .' 이것은 빈약 한 코드에 대한 오해의 소지가있는 주석입니다. 당신은'EOFException'을 따로 잡아서 로그하고, 연결을 닫아야한다; 이 코드 줄에 대한 여러분의 의견에 상당히 근접하게 대응하는'IOException '을 잡아야합니다. '예외 '잡는 것은 일반적으로 빈약 한 습관입니다. – EJP

+0

@ EJP 나는 당신이 말한 것을 시도했지만, 클라이언트가 연결을 끊었을 때도 결코 호출되지 않았습니다. 이 방법을 구현하기 위해 어떻게 구현할지 명확히 할 수 있다면, 나는 그것을 이해하지 못했기 때문에 많은 도움이 될 것입니다. –

답변

0

'연결 재설정'에는 여러 가지 원인이있을 수 있지만 가장 일반적인 원인은 피어에 의해 이미 닫힌 연결에 작성한 것입니다. 즉, 응용 프로그램 프로토콜 오류입니다.

루프는 EOFException을 별도로 잡아서 규칙적으로 처리해야합니다.