DatagramPacket sem saber o tamanho (length)

5 respostas
jhonatanoliveira

Bom dia, pessoal.
Tenho uma dúvida referente a um sistema que envia e recebe pacotes usando o protocolo UDP.
Ao enviar os pacotes DatagramPacket, usando um DatagramSocket (o servidor), eu decido o tamanho do pacote (parâmetro lengh do construtor do DatagramPacket) simplemente obtendo o tamanho dos dados que enviarei.
Porém, ao receber os dados em outro DatagramSocket (o cliente), eu não sei o tamanho do pacote a se receber. Porém, para receber o pacote eu preciso criar um objeto DatagramPacket, que, por sua vez, exige o tamanho do pacote, como dito anteriormente.
Alguém sabe uma forma de obter o tamanho do pacote antes de efetivamente recebê-lo? Ou então uma forma de não especificar um tamanho limite para o recebimento de pacotes.
Obrigado pela ajuda.

5 Respostas

ViniGodoy

Movido para o fórum de java avançado.

Você pode criar um DatagramPacket o maior tamanho possível para o seu protocolo, ou com algo bem grande.
Esse objeto criado será preenchido com os dados que forem recebidos do servidor, e ali você obterá o valor correto do tamanho do pacote.

O tamanho máximo de um pacote UDP é de 2^16-1 octetos. Se realmente precisar, pode definir esse tamanho (em torno de 64k).

jhonatanoliveira

Obrigado, VinyGodoy pela resposta.
Confirmando então com um exemplo: se eu tenho um objeto DatagramPacket de tamanh 8 bytes, por exemplo, e recebo um pacote de 2 bytes, o objeto DatagramPacket se ajusta aos 2bytes? Caso sim, como isso é feito? Preenche com nulo os 6 bytes restantes ou refaz o objeto original adaptando-o para ter tamanho 2 bytes? E, caso o pacote recebido seja maior que 8 bytes? Os dados são truncados?
Obrigado, mais uma vez.

ViniGodoy

Sim é truncado, como explica o próprio javadoc.

No caso, o parâmetro length é preenchido com o tamanho recebido.
O buffer interno continuará com os 8 bytes originais, mas com apenas 2 bytes preenchidos com valor e o resto com o que estava lá antes (provavelmente 0s, se vc criou um DatagramPacket novo).

Eu geralmente crio um packet bem grande para recepção, e daí copio os dados para uma estrutura mais conveniente quando descubro o tamanho deles.

jhonatanoliveira

Ah, boa dica!
É porque o parseador do protobuf (protocolo q estou usando para a comunicação), reclamaria caso visse “zeros” nos dados. Ele tentaria interpretar e retornaria um erro. Pelo o que você propos então, eu posso criar um DatagramPacket pra receber (um que tenha um bom tamanho) e logo em seguida, copiar os dados para outro DatagramPacket já com o tamanho certo (obtigo do primeiro DatagramPacket). É isso mesmo?
Obrigado, de novo.

ViniGodoy

Isso aí. Eu geralmente copio para um array de bytes ou para um ByteBuffer, mas dá quase na mesma.

Criado 11 de setembro de 2011
Ultima resposta 11 de set. de 2011
Respostas 5
Participantes 2