2014-11-23 2 views
0

내 프로젝트는 서버 측과 클라이언트 측의 두 부분으로 구성됩니다. 내가 서버 측을 시작하면 모든 것이 OK이지만, 나는 때때로 클라이언트 측을 시작할 때이 오류를 얻을 :이 오류가 더 자주 발생 다른 PC에서이 프로젝트를 실행하려고Java ObjectOutputStream 재설정 오류

java.io.IOException: stream active 
    at java.io.ObjectOutputStream.reset(Unknown Source) 
    at client.side.TcpConnection.sendUpdatedVersion(TcpConnection.java:77) 
    at client.side.Main.sendCharacter(Main.java:167) 
    at client.side.Main.start(Main.java:121) 
    at client.side.Main.main(Main.java:60) 

. 자바 문서에서 나는이 비트를 발견했다.

Reset may not be called while objects are being serialized. If called inappropriately, an IOException is thrown.

는 그리고이 오류가 나는 높이 넣어 노력

void sendUpdatedVersion(CharacterControlData data) { 
     try { 
      ServerMessage msg = new ServerMessage(SEND_MAIN_CHARACTER); 
      msg.setCharacterData(data); 
      oos.writeObject(msg); 
      oos.reset(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

을 발생합니다()하지만 도움이되지 않은 기능입니다. 어떤 아이디어? 게다가, 서버쪽에 오류가 없습니다.

+0

'reset()'호출로 무엇을 달성하려고합니까? –

+0

저는 새로운 객체가 매번 생성된다는 것을 알고 있습니다. 그래서 이론에서는 필요하지 않습니다. 그러나 재설정하지 않으면 오래된 데이터를 보냅니다. – master9999

답변

1

나는 당신이 오해하고 있다고 생각합니다. reset(). 이전에 기입해진 오브젝트 인스턴스는 무시하도록 (듯이) 스트림을 리 셋트합니다. 이것은 스트림에 객체를 보내고 곧바로 리셋하기 때문에 당신이 원하는 것을 당신이 원하는 것이 아니기 때문에 무의미합니다.

필요한 것은 모두 flush()입니다. 그것이 충분하지 않다면 문제는 수신 측에 있습니다.

0

나는 당신이 close()를 reset()과 혼동하고 있다고 생각합니다. 사용

oos.close(); 

대신 oos.reset();

0

reset()을 호출하는 것은 완벽하게 유효한 작업입니다. '데이터'가 재사용되거나 데이터의 일부 필드가 재사용 될 수 있으며 두 번째로 sendUpdatedVersion을 호출하면 해당 부분이 전송되지 않습니다. 따라서 사용이 유효하지 않다고 불평하는 사람들은 정확하지 않습니다. 이제이 오류 메시지가 나타나는 이유는 무엇입니까?

오류 메시지가 표시되는 것은 사용자가 writeObject 호출 체인의 최상위 레벨에 있지 않다는 것입니다. sendUpdatedVersion은 다른 writeObject에서 호출 된 메소드에서 호출되어야합니다.

일부 개체가 사용자 지정 writeObject()를 구현 중이며 그 메서드가이 메서드를 호출한다고 가정합니다.

따라서 sendUpdatedVersion이 호출 체인의 최상위 레벨에서 호출 될 때 구분해야하며이 경우에는 reset() 만 사용해야합니다.

+0

네가 맞아. 재사용 된 데이터를 사용하고 있습니다. 그것이 내가 reset()을 필요로하는 이유입니다. 그러나 나는 오류에 대해 잘 모르겠습니다. 나는 너무 어리석어서 서버 쪽에서 스트림을 닫을 수 없었습니다. 아마도 그 이유가 ... 지금은 제대로 작동하는 것처럼 보입니다. 나중에 다른 기계를 확인해 보겠습니다. – master9999

+0

'writeObject()'호출의 중간, 즉 private'writeObject()'메소드 내부에 있지 않는 한,이 예외를 얻을 때를 제외하고는 *하는 것이 완벽하게 유효합니다. [Javadoc] (https://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html#reset--). – EJP

관련 문제