Отправка UDP-пакета в Java
Отправка начинается с текста на английском и массива
байтов. Конструктор DatagramPacket принимает
данные, их длину, InetAddress хоста и номер
порта. Хост 127.0.0.1 указывает на ту же
машину, где запущена программа.
Метод send у DatagramSocket
передаёт пакет в сеть. Порт назначения берут у
сокета-приёмника после его запуска. Полный пример
с потоком-слушателем выглядит так:
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);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
receiver.start();
ready.await();
try (DatagramSocket socket = new DatagramSocket()) {
byte[] data = "ping".getBytes(
StandardCharsets.UTF_8,
);
DatagramPacket packet = new DatagramPacket(
data,
data.length,
InetAddress.getByName("127.0.0.1"),
port[0],
);
socket.send(packet);
}
}
}
Другой текст кладут в тот же каркас, меняют только
строку перед getBytes. Длина в пакете
должна совпадать с размером массива:
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);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
receiver.start();
ready.await();
try (DatagramSocket socket = new DatagramSocket()) {
byte[] data = "order 42".getBytes(
StandardCharsets.UTF_8,
);
DatagramPacket packet = new DatagramPacket(
data,
data.length,
InetAddress.getByName("127.0.0.1"),
port[0],
);
socket.send(packet);
System.out.println(data.length);
}
}
}
Отправьте на localhost пакет с текстом
"lab send". Приёмник пусть выведет
полученную строку в консоль.
Отправьте два пакета подряд с текстами
"first" и "second" на один
порт. Приёмник напечатает обе строки по порядку.