Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpUdRcv 309 of 322 menu
◀ ▶

Приём 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" выведите число символов в полученной строке.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить