2013-07-08 3 views
-1

후 소켓에서의 InputStream를 사용할 수 없습니다 클라이언트 측에서이 코드를 가지고 있습니다 :여기 상황이다 writeObject에

PrintWriter out = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()),true); 
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
/* 
    using in/out, no problems 
*/ 
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
SomeObject so = (SomeObject)ois.readObject(); 
out.println("some text"); 

somebody를 보낼 때까지 모든 것이 정상입니다. 클라이언트는 객체를 올바르게 수신하지만 아무런 문제가 없습니다. 하지만 더 이상 소켓을 사용할 수 없습니다. oos.close()를 수행하면 "소켓이 닫혔다"는 Exception이 발생합니다. oos.reset()을 수행하면 비슷한 메시지와 함께 예외가 발생합니다. "소켓 재설정". 그래서 내가 무엇을해야하니? writeObject() 이후에 동일한 입출력 스트림을 사용할 수 있습니까?

"some text"를 보낼 때 나는 readLine()을 몇 번이나 호출했는지에 상관없이 null을 얻는다. 나는 결코 "some text"를 얻지 못한다.

답변

0

동일한 기본 소켓에서 여러 유형의 스트림/리더/라이터를 사용할 수 없습니다. 모든 스트림과 독자 및 작성자가 버퍼링되어 모두 완전히 섞일 것입니다. 스틱 톤 종류. 하나의 프로토콜을 고수하십시오. 객체 스트림이 있다면 모든 것을 위해 사용하십시오. 그리고 메시지마다가 아닌 소켓의 수명 동안 한번 생성하십시오.

+0

그렇다면 동일한 소켓에도 Reader와 InputStream을 연결하면 안됩니까? 예 : 내가 문자열 "RECIEVE FILE"을 전달하여 서버에 메시지를 보내고 BufferedOutputStream을 사용하여 작은 바이너리 파일 또는 바이너리 정보를 나타내는 byte [] 배열을 전송합니다. 메시지를 보낸 후 플러시()하면 제대로 작동합니다. 그러나 가장 좋은 방법은 무엇입니까? – Marko