2016-06-29 3 views
0

우선, 나는 이것이 중복 질문이라는 것을 알고 있지만 다른 대답에서는 이해할 수 없습니다!
그래서 저는 java 소켓을 사용하여 클라이언트 - 서버 연결을하고 있습니다. Listener라는 클래스가 있는데, 새 클라이언트를 얻을 때마다 클라이언트 소켓에 할당합니다. 그런 다음 클라이언트에서 반복적으로 듣고 있는데 클라이언트에서 응답을 받으면 인터페이스 "클래스"의 메소드로 보냅니다 (이 마지막 질문은이 질문과 관련이 없지만 아무도 필요하지 않습니다.
내 코드)에 대해 질문 : "S"는 소켓이고, '산부인과'Java - 오류 StreamCorruptedException : 유효하지 않은 형식 코드 : AC

  while(!s.isClosed()){ 
      ob = new ObjectInputStream(s.getInputStream()); 
      try { 
       handler.objectReceived(ob.readObject(), instance); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



     } 

는 ObjectOutputStream에, 그리고 "핸들러 것은"위에서 언급 한 인터페이스입니다. 그러나, 그것을 사용하여 잠시 후 java.io.StreamCorruptedException 오류가 발생합니다 : handler.objectReceived(ob.readObject(), instance); 라인에 잘못된 유형 코드 : AC ...

어떤 도움 ??

참고 :이 질문을 중복으로 표시하지 마십시오. 나는 다른 대답을 이해할 수 없다. 나는 그것을 분명히 설명 할 누군가를 요구하고있다. 이후, 개조자는 원하는 경우 삭제할 수 있습니다. 나는이 오류로 인해 정말로 짜증이났다!

+0

또한 소켓을 통해 객체를 보내는 코드를 게시 할 수 있습니까 – AntJavaDev

+0

여기에 신비가 없습니다. 당신은 복제물의 제 대답이하지 말라고 정확히 말하고 있습니다. 루프 외부에'ObjectInputStream'를 작성합니다. NB'isClosed()'는 적절한 종료 조건이 아닙니다. 올바른 조건은'EOFException'입니다. – EJP

+0

루프 외부에 넣었습니다. 그래도 여전히 오류가 발생합니다 ... – JHacking

답변

0

가장 많이 발생하는 원인은 ObjectInputStream을 계속 다시 작성한 것입니다. 코드를이 코드로 변경하면 스트림이 손상되지 않았다고 가정하면 잘 작동합니다.

ob = new ObjectInputStream(s.getInputStream()); 
while(!s.isClosed()){ 

    try { 
     handler.objectReceived(ob.readObject(), instance); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

ObjectOutputStream을 만드는 객체를 작성하는 코드는 한 번만 수행한다고 가정합니다. ObjectOutputStream을 작성하면 (자), 4 바이트로 구성되는 헤더가 기입 해집니다.

bout.writeShort(STREAM_MAGIC); 
bout.writeShort(STREAM_VERSION); 

이제 ObjectInputStream을 만들면 헤더가 읽혀집니다 (이 호출은 생성자에서 수행됩니다).

이제 ObjectInputStream을 다시 작성하기 때문에 데이터 스트림에 존재하지 않는 헤더를 읽으려고 시도합니다.

본질적으로 ObjectOutputStream 및 ObjectInputStream을 정확히 한 번만 만듭니다.

+0

설명해 주셔서 감사합니다. 왜 지금 오류가 발생했는지 이해하지만, 변경했다고 생각하더라도 여전히 오류가 발생합니다. – JHacking

+0

이 답변은 올바른 치료법을 제공하지만 올바른 이유는 제시하지 않습니다. 정당한 이유 때문에 사본에 내 대답을보십시오. – EJP

+0

@EJP 아아. 나는 반복적으로 입력 스트림을 만드는 이상한 행동을 발견했다. 하지만 당신이 말한 것은 자바 소스와 일치하는 것 같습니다. 나는 대답을 업데이트 할 것이다. – user254948

관련 문제