2009-04-01 2 views
3

SocketChannel을 사용하는 경우 부분 쓰기 및 읽기를 처리하기 위해 읽기 및 쓰기 버퍼를 유지해야합니다.NIO DatagramChannel을 사용하면 부분적으로 읽기/쓰기 된 패킷을 처리해야합니까?

DatagramChannel을 사용할 때 필요하지 않을 수도 있다는 잔소리에 대한 의구심이 있지만 정보가 부족합니다.

이야기가 무엇인가요?

대기중인 모든 데이터 그램을 읽을 때까지 null을 되 찾을 때까지 (비 차단) 수신 (ByteBuffer)을 반복적으로 호출해야합니까?

비 차단 모드로 전송할 때 send (ByteBuffer, SocketAddress)를 사용하여 전체 버퍼를 전송하거나 완전히 거부하거나 부분적으로 기록 된 버퍼를 유지해야합니까?

답변

5

데이터 그램을 읽을 때마다 전체 데이터 그램을 읽습니다. 이 java.nio.DatagramChannel.read의 설명의 경우가 있다는 힌트가있다 :

다음 데이터 그램의 나머지는 주어진 버퍼에 남아보다 그램에 더 많은 바이트가있는 경우 자동 폐기 됨

SocketChannel을 처리 할 때는 메시지 스트림입니다. TCP가 개별 패킷을 재조합하여 다른 쪽에서 메시지를 재생성하기 때문에 각 읽기마다 얼마나 많은 데이터를 얻는 지 또는 얼마나 작은 데이터를 얻을 수 있는지 보장 할 수 없습니다. 그러나 DatagramChannel을 사용하여 읽고있는 UDP의 경우 각 패킷은 고유 한 원자 메시지입니다.

+0

그래도 글을 쓸 수 없습니까? 나가는 버퍼가 꽉 차서 부분적인 쓰기가있을 것인가, 아니면 전부 아니면 아무것도 아닌 일이 될 것인가? – Nuoji

+0

그것은 또한 모두 또는 아무것도 아닙니다. 데이터 그램보다 큰 것을 작성하려고하면 어떤 일이 일어날 지 확신하지 못합니다 (예외?), 확실히 보내지지 않을 것입니다. 단 하나의 UDP 데이터 그램에 대해 거의 64k가 있음에 유의하십시오. –

+0

다른 커플 노트 : 데이터 그램이 다른 쪽 끝에 전달된다는 보장은 없지만 대개 전달됩니다. 또한 Windows는 네트워크의 MTU를 초과하는 브로드 캐스트 UDP 데이터 그램을 보낼 수있는 것 같지 않으므로주의하십시오. –

관련 문제