socket servidor para librerias ejemplo datagramsocket comunicacion cliente java sockets networking udp

servidor - socket tcp java



Cómo obtener el tamaño real del paquete `byte[]` array en Java UDP (2)

Usted ha respondido su propia pregunta. packet.getLength() devuelve el número real de bytes en el datagrama recibido. Entonces, solo tiene que usar el buffer[] del índice 0 para indexar packet.getLength()-1.

Tenga en cuenta que esto significa que si llama a receive() en un bucle, tiene que volver a crear el DatagramPacket cada vez que pasa el bucle, o restablecer su longitud al máximo antes de la recepción. De getLength() contrario, getLength() sigue reduciéndose al tamaño del datagrama más pequeño recibido hasta ahora.

Esta es la pregunta posterior de mi anterior: Java UDP enviar - recibir paquete uno por uno

Como indiqué allí, básicamente, quiero recibir un paquete uno por uno como lo está vía UDP.

Aquí hay un código de ejemplo:

ds = new DatagramSocket(localPort); byte[] buffer1 = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer1, buffer1.length); ds.receive(packet); Log.d("UDP-receiver", packet.getLength() + " bytes of the actual packet received");

Aquí, el tamaño real del paquete es, digamos, 300bytes, pero el buffer1 está asignado como 1024 byte, y para mí, es algo malo con lidiar con buffer1 .

¿Cómo obtener la matriz de byte[] tamaño de paquete real desde aquí?

y, más fundamentalmente, ¿por qué tenemos que preasignar el tamaño del búfer para recibir paquetes UDP en Java de esta manera? (node.js no hace esto)

¿Hay alguna forma de no asignar previamente el tamaño del búfer y recibir directamente el paquete UDP tal como está?

Gracias por tu pensamiento


auto respuesta Hice lo siguiente:

int len = 1024; byte[] buffer2 = new byte[len]; DatagramPacket packet; byte[] data; while (isPlaying) { try { packet = new DatagramPacket(buffer2, len); ds.receive(packet); data = new byte[packet.getLength()]; System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength()); Log.d("UDPserver", data.length + " bytes received"); } catch()//........... //...........