NIO DataGramChannel을 사용하면 부분적으로 읽기/서면 패킷을 처리해야합니까?

StackOverflow https://stackoverflow.com/questions/707351

  •  22-08-2019
  •  | 
  •  

문제

Socketchannel을 사용하는 경우 부분 쓰기 및 읽기를 처리하려면 읽기 및 쓰기 버퍼를 유지해야합니다.

DatagramChannel을 사용할 때 필요하지 않을 수도 있다는 잔소리가 있지만 정보는 거의 없습니다.

이야기는 무엇입니까?

대기 대기 데이터 그램을 읽을 때까지 널 돌면 다시 돌아올 때까지 (비 블로킹) 수신 (바이 테 버퍼)을 반복해서 전화해야합니까?

비 블로킹 모드로 보낼 때, 전체 버퍼를 보내거나 완전히 거부하기 위해 Send (Bytebuffer, Socketaddress)에 의존 할 수 있습니까? 아니면 부분적으로 작성된 버퍼를 보관해야합니까?

도움이 되었습니까?

해결책

데이터 그램을 읽는 모든 데이터 그램은 전체 데이터 그램입니다. java.nio.datagramchannel.read의 설명에서 이것이 사실이라는 힌트가 있습니다.

데이터 그램에 주어진 버퍼에 남아있는 것보다 더 많은 바이트가있는 경우 데이터 그램의 나머지 부분은 조용히 폐기됩니다.

Socketchannel을 다룰 때 메시지 스트림입니다. TCP가 다른 쪽에서 메시지를 재현하기 위해 별도의 패킷을 재 조립하기 때문에 각 읽기에 얼마나 적은 데이터를 얻을 수 있는지 보장 할 수 없습니다. 그러나 UDP (데이터 그램 채널로 읽고있는 것)의 경우 각 패킷은 고유 한 원자 메시지입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top