2011-04-12 6 views
1

내가 사용하려고 예외가 점점 오전 :보내기 객체는

oos = new ObjectOutputStream(socketChannel.socket().getOutputStream()); 
oos.writeObject(o); 

을 그리고 이것은 예외 제기

java.nio.channels.IllegalBlockingModeException 

이 불가능 비의 개체를 전달하는 것입니다 블로킹 소켓? 그렇다면 소켓 채널을 통해 메시지 객체를 전달하는 방법은 어떻게해야합니까? 나는이 대답을 다른 곳을보고했지만 하나를 찾을 수 없습니다

...

답변

2

당신은 아마 ByteBufferwrite() 채널에이야 구축 자신의 ObjectOutputStream 구현을 작성하는 것이 좋습니다.

비 차단 소켓을 사용하면 채널 소켓을 직접 사용할 수 없습니다. 채널의 read()write() 방법을 사용해야합니다.

ObjectOutputStream을 작성할 때 출력을 버퍼링하고 flush() 메서드를 사용하여 채널에 버퍼를 쓰는 데 주로 write() 메서드를 재정의해야합니다. 그런 다음, 다음과 같이 할 수 writeObject() 메소드를 오버라이드 (override) :

public void writeObject(Object o) throws IOException { 
    super.writeObject(o); 
    flush(); 
} 

데이터가 각 개체 쓰기 후에 작성됩니다 확인하십시오.

+0

그래서 기본적으로, 나는 자신의 출력 스트림을 만들고 ByteBuffer 대신 byte [] 대신 쓰기 만하면되지만 소켓의 스트림을 얻을 수 없다면이 출력 스트림을 어떻게 사용할 것인지 이해할 수 없습니다 . 미안하지만 자바에서 이런 종류의 낮은 수준의 통신을 사용하지 못했습니다. 좋은 예가 될 것입니다. – Draiken

+0

내가 명확하지 않으면 미안합니다. 나는이 새로운 출력 스트림이 채널의'write()'메소드가 아니라'write()'메소드를 사용하여 채널을 감쌀 것이라는 것을 의미했다. – Jonathan

0

이 분야에서 일한 지 오래되었지만 writeObject을 감싸는 것보다 더 복잡한 것처럼 보였습니다. java.nio은 일반적으로 고정 크기 버퍼를 예상합니다 (동적으로 할당 할 수는 있지만). 원격 엔드 포인트는 임의의 Object이 읽는 데 얼마나 많은 정보가 필요한지 알아야합니다. 내가 한 일은 처음에 int 헤더를 보내 상대방에게 얼마나 많은 데이터를 가져다 줄 것인가를 알려주는 것이고, 바이트 배열로 객체를 직렬화하여 전송하는 것입니다.

나는 아직 버그가있을 수 있으므로 got an example of this입니다. 따라서 위험은 사용자 자신의 책임하에 사용하십시오. PendingDataBufferS은 처음 할당 된 고정 크기 버퍼보다 ​​큰 개체를 처리하는 데 필요합니다.