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.
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).
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.
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.
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.
Isso aí. Eu geralmente copio para um array de bytes ou para um ByteBuffer, mas dá quase na mesma.