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

Ответ по 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" и выведите ответ на стороне отправителя в консоль.

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