Ответ по UDP в Dart
UDP не хранит клиента отдельно: кто прислал пакет,
видно в полях address и port у
датаграммы после receive. Ответ собирают
так же - список байтов и вызов send с тем
же хостом и портом источника.
Приемник после чтения текста формирует короткий ответ на английском и шлет его тем же сокетом:
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) {
receiver.send(
utf8.encode('ack'),
datagram.address,
datagram.port,
);
done.complete();
}
}
});
var sender = await RawDatagramSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
sender.send(
utf8.encode('ping'),
InternetAddress.loopbackIPv4,
listenPort,
);
await done.future;
receiver.close();
sender.close();
}
Текст ответа может зависеть от пришедшего сообщения, но адрес назначения всегда берут из входящей датаграммы. Отправитель в том же процессе может ждать ответ на своем сокете:
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 requestDone = Completer<void>();
receiver.listen((event) {
if (event == RawSocketEvent.read) {
var datagram = receiver.receive();
if (datagram != null) {
receiver.send(
utf8.encode('got it'),
datagram.address,
datagram.port,
);
requestDone.complete();
}
}
});
var sender = await RawDatagramSocket.bind(
InternetAddress.loopbackIPv4,
0,
);
var answerDone = Completer<void>();
sender.listen((event) {
if (event == RawSocketEvent.read) {
var datagram = sender.receive();
if (datagram != null) {
print(utf8.decode(datagram.data));
answerDone.complete();
}
}
});
sender.send(
utf8.encode('hello'),
InternetAddress.loopbackIPv4,
listenPort,
);
await requestDone.future;
await answerDone.future;
receiver.close();
sender.close();
}
На запрос "check" ответьте текстом
"ok". Адрес отправителя возьмите из
принятого пакета.
На запрос "version" ответьте
"1.0" и выведите ответ на стороне
отправителя в консоль.