Usando NIO DatagramChannel que eu preciso para lidar parcialmente ler pacotes / escrita?

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

  •  22-08-2019
  •  | 
  •  

Pergunta

Ao usar SocketChannel, você precisa manter buffers ler e escrever para lidar com as gravações parciais e lê.

Eu tenho uma suspeita persistente de que ele pode não ser necessário quando se utiliza um DatagramChannel, mas informação é escassa.

Qual é a história?

Se eu chama (non-blocking) receber (ByteBuffer) repetidamente até conseguir um nulo de volta para ler todos os datagramas de espera?

Ao enviar no modo sem bloqueio, posso confiar em send (ByteBuffer, SocketAddress) quer enviar a todo o tampão ou rejeitá-la inteiramente, ou que eu preciso para possivelmente manter buffers parcialmente escritos?

Foi útil?

Solução

Cada leitura de um Datagram é todo o datagrama, nada mais, nada menos. Há um indício de que este é o caso na descrição do java.nio.DatagramChannel.read:

Se houver mais bytes no datagrama de permanecer em determinado tampões, em seguida, o resto do datagrama é descartado silenciosamente

Quando você está lidando com um SocketChannel, é um fluxo de mensagens; não há nenhuma garantia quanto ou quão pouco dados que você vai ter em cada leitura, como TCP é remontar pacotes separados para recriar a mensagem do outro lado. Mas para UDP (que é o que você está lendo com o DatagramChannel) cada pacote é a sua própria mensagem atômica.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top