Приём UDP-пакета в Java
Приёмник создаёт буфер фиксированного размера и
оборачивает его в DatagramPacket. Вызов
receive ждёт первый пакет и заполняет
буфер. Реальная длина лежит в getLength,
по ней строят строку из getData, а не по
всему массиву.
Строку получают через конструктор String с
началом 0 и длиной пакета. После приёма текст
можно напечатать или обработать дальше:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main(String[] args) throws Exception {
CountDownLatch ready = new CountDownLatch(1);
int[] port = new int[1];
Thread receiver = new Thread(() -> {
try (DatagramSocket socket = new DatagramSocket(0)) {
port[0] = socket.getLocalPort();
ready.countDown();
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(
buf,
buf.length,
);
socket.receive(packet);
String text = new String(
packet.getData(),
0,
packet.getLength(),
StandardCharsets.UTF_8,
);
System.out.println(text);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
receiver.start();
ready.await();
try (DatagramSocket socket = new DatagramSocket()) {
byte[] data = "note".getBytes(
StandardCharsets.UTF_8,
);
DatagramPacket packet = new DatagramPacket(
data,
data.length,
InetAddress.getByName("127.0.0.1"),
port[0],
);
socket.send(packet);
}
}
}
Размер буфера задают с запасом: лишние байты в
строку не попадут, если указать getLength.
Тот же приёмник подходит для более длинного текста,
когда он помещается в буфер:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CountDownLatch;
public class Main {
public static void main(String[] args) throws Exception {
CountDownLatch ready = new CountDownLatch(1);
int[] port = new int[1];
Thread receiver = new Thread(() -> {
try (DatagramSocket socket = new DatagramSocket(0)) {
port[0] = socket.getLocalPort();
ready.countDown();
byte[] buf = new byte[512];
DatagramPacket packet = new DatagramPacket(
buf,
buf.length,
);
socket.receive(packet);
String text = new String(
packet.getData(),
0,
packet.getLength(),
StandardCharsets.UTF_8,
);
System.out.println(text.length());
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
receiver.start();
ready.await();
try (DatagramSocket socket = new DatagramSocket()) {
byte[] data = "status ok".getBytes(
StandardCharsets.UTF_8,
);
DatagramPacket packet = new DatagramPacket(
data,
data.length,
InetAddress.getByName("127.0.0.1"),
port[0],
);
socket.send(packet);
}
}
}
Примите один пакет с текстом "ready" и
выведите его в консоль одной строкой.
После приёма текста "metric" выведите
число символов в полученной строке.