2011-05-08 4 views
3

새로운 클라이언트 소켓이 조인 될 때마다 서버가 모든 클라이언트를 모든 클라이언트로 보내는 클라이언트 - 서버 응용 프로그램이 있습니다. 문제는 새로운 클라이언트가 조인 할 때 올바른 목록을 얻지 만 오래된 클라이언트는 자신이 가입 할 때 가지고 있던 오래된 목록을 얻는다는 것입니다. 그들은 일종의 같은 물체를 입력 스트림에서 매번 가져옵니다.자바 입력 스트림 버퍼 객체?

어떻게 든 입력 스트림을 플러시 할 수 있습니까?

객체를 읽기 :

while((inObject = in.readObject()) != null) { 
    ... 
} 

개체를 보내기 :

out.writeObject(object); 
+0

고객이 보내는 메일을 받고 있습니다. 그들은 "입력 스트림에서 동일한 객체를 가져 오지"않습니다. 그러나 올바른 데이터를 전송하지 않아서 목록을 보내고있는 것입니다. –

+0

재설정 작업을 수행했습니다 :) –

+1

ObjectOutputStream.reset()이 아래에 나와있는 답변이지만, BTW 루프 종료 조건이 잘못된 것 같습니다. ObjectInputStream.readObject()는 null을 작성한 경우에만 null을 반환합니다. EOS에서는 EOFException을 발생시킵니다. – EJP

답변

5

ObjectOutputStream.reset() 당신이 찾고있는 것입니다.

이렇게하면 메모리가 부족해질 수도 있습니다. 그렇지 않으면 메모리가 부족합니다. 그 이유는 ObjectInput/OutputStream 클래스가이를 통해 전송 된 모든 객체를 캐시하므로 객체가 가비지 수집되지 않도록하기 때문입니다. 이는 순환 참조를 처리하는 데 필요하며 개체가 여러 번 전송 될 때 성능이 향상됩니다.

2

나는 문제는 다음 기존 ObjectOutputStream를 재사용, 기존 개체를 수정하고 있다는 의심. ObjectOutputStream에서 reset으로 전화하면 잠재적으로 수정 된 개체에 대한 참조 캐시를 효과적으로 지울 수 있습니다.