Введение в UDP в Java
Сервис опроса датчиков может слать короткие отчёты раз в секунду, не держа постоянный канал как при TCP. Протокол UDP передаёт отдельные датаграммы: блок байтов с адресом получателя. Соединение заранее не открывают, каждый пакет несёт хост и порт назначения.
В Java 27 для этого служат DatagramSocket и
DatagramPacket из пакета java.net.
Приёмник слушает свободный порт: сокет создают с
номером 0, система выдаёт значение через
getLocalPort. Отправитель шлёт текст на
127.0.0.1 и этот порт. Текст кладут в массив
байтов через getBytes, на приёме собирают
строку из прочитанной длины.
Оба конца удобно держать в одном main:
приёмник в отдельном потоке, сокеты закрывают через
try-with-resources. Полный одноразовый обмен
на localhost выглядит так:
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 = "hello udp".getBytes(
StandardCharsets.UTF_8,
);
DatagramPacket packet = new DatagramPacket(
data,
data.length,
InetAddress.getByName("127.0.0.1"),
port[0],
);
socket.send(packet);
}
}
}
В консоли приёмника появится строка hello udp.
Такой обмен показывает суть UDP: один пакет, один
адрес, без рукопожатия как у TCP.