Несколько UDP-пакетов в Dart
Один сокет может принять серию пакетов: после каждого
receive обработчик listen
срабатывает снова. На отправке цикл вызывает
send для каждой строки - порядок на
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 count = 0;
var done = Completer<void>();
receiver.listen((event) {
if (event == RawSocketEvent.read) {
var datagram = receiver.receive();
if (datagram != null) {
print(utf8.decode(datagram.data));
count++;
if (count >= 3) {
done.complete();
}
}
}
});
var sender = await RawDatagramSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
var host = InternetAddress.loopbackIPv4;
for (var word in ['one', 'two', 'three']) {
sender.send(utf8.encode(word), host, listenPort);
}
await done.future;
receiver.close();
sender.close();
}
Ответ на каждый пакет тоже можно слать в цикле на
address и port из соответствующего
приема. Отправитель тогда читает несколько ответов
подряд:
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 requestCount = 0;
var requestsDone = Completer<void>();
receiver.listen((event) {
if (event == RawSocketEvent.read) {
var datagram = receiver.receive();
if (datagram != null) {
var tag = utf8.decode(datagram.data);
receiver.send(
utf8.encode('echo $tag'),
datagram.address,
datagram.port,
);
requestCount++;
if (requestCount >= 2) {
requestsDone.complete();
}
}
}
});
var sender = await RawDatagramSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
var answerCount = 0;
var answersDone = Completer<void>();
sender.listen((event) {
if (event == RawSocketEvent.read) {
var datagram = sender.receive();
if (datagram != null) {
print(utf8.decode(datagram.data));
answerCount++;
if (answerCount >= 2) {
answersDone.complete();
}
}
}
});
var host = InternetAddress.loopbackIPv4;
for (var word in ['a', 'b']) {
sender.send(utf8.encode(word), host, listenPort);
}
await requestsDone.future;
await answersDone.future;
receiver.close();
sender.close();
}
Отправьте пять пакетов с текстами "n1" …
"n5". Приемник выведет пять строк по
одной на пакет.
Примите три запроса и на каждый ответьте
"ok". Отправитель выведет три строки
ответа.