Прием UDP-пакета в Dart
Приемник подписывается на сокет через listen.
При событии RawSocketEvent.read вызывают
receive и получают объект датаграммы.
Текст берут из data через
utf8.decode - отдельно указывать длину
не нужно, если пакет целиком в памяти.
После приема текст можно напечатать или обработать дальше:
import 'dart:async';
import 'dart:convert';
import 'dart:io';
void main() async {
var receiver = await RawDatagramSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
var listenPort = receiver.port;
var done = Completer<void>();
receiver.listen((event) {
if (event == RawSocketEvent.read) {
var datagram = receiver.receive();
if (datagram != null) {
print(utf8.decode(datagram.data));
done.complete();
}
}
});
var sender = await RawDatagramSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
sender.send(
utf8.encode('note'),
InternetAddress.loopbackIPv4,
listenPort,
);
await done.future;
receiver.close();
sender.close();
}
Сокет принимает пакет, пока его размер укладывается в ограничения UDP. Тот же приемник подходит для более длинного текста на localhost:
import 'dart:async';
import 'dart:convert';
import 'dart:io';
void main() async {
var receiver = await RawDatagramSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
var listenPort = receiver.port;
var done = Completer<void>();
receiver.listen((event) {
if (event == RawSocketEvent.read) {
var datagram = receiver.receive();
if (datagram != null) {
var text = utf8.decode(datagram.data);
print(text.length);
done.complete();
}
}
});
var sender = await RawDatagramSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
sender.send(
utf8.encode('status ok'),
InternetAddress.loopbackIPv4,
listenPort,
);
await done.future;
receiver.close();
sender.close();
}
Примите один пакет с текстом "ready" и
выведите его в консоль одной строкой.
После приема текста "metric" выведите
число символов в полученной строке.