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

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

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