Usando NIO DatagramChannel que eu preciso para lidar parcialmente ler pacotes / escrita?
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?
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.