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

Рассылка по WebSocket в Dart

В dart:io нет готового метода broadcast: хранят список открытых WebSocket и при рассылке вызывают add у каждого элемента. Это удобно для уведомлений, когда адресатов несколько и ответ не привязан к одному входящему кадру.

Два клиента подключаются к одному порту на 127.0.0.1; после рукопожатия сервер обходит список сокетов. Каждый клиент получает строку в своем listen:

import 'dart:async'; import 'dart:io'; void main() async { var sockets = <WebSocket>[]; var left = 2; var got = Completer<void>(); var httpServer = await HttpServer.bind( InternetAddress.loopbackIPv4, 0, ); var port = httpServer.port; httpServer.listen((request) async { if (WebSocketTransformer.isUpgradeRequest( request, )) { var socket = await WebSocketTransformer.upgrade( request, ); sockets.add(socket); socket.done.then((_) { sockets.remove(socket); }); } }); var uri = 'ws://127.0.0.1:$port'; Future<WebSocket> makeClient() async { var client = await WebSocket.connect(uri); client.listen((data) { print(data); left--; if (left == 0) { got.complete(); } }); return client; } var first = await makeClient(); var second = await makeClient(); for (var socket in sockets) { socket.add('news'); } await got.future; await first.close(); await second.close(); await httpServer.close(force: true); }

Текст рассылки может быть любым на английском. Главное - дождаться подключения всех клиентов, затем один раз обойти список сокетов:

import 'dart:async'; import 'dart:io'; void main() async { var sockets = <WebSocket>[]; var left = 2; var got = Completer<void>(); var httpServer = await HttpServer.bind( InternetAddress.loopbackIPv4, 0, ); var port = httpServer.port; httpServer.listen((request) async { if (WebSocketTransformer.isUpgradeRequest( request, )) { var socket = await WebSocketTransformer.upgrade( request, ); sockets.add(socket); socket.done.then((_) { sockets.remove(socket); }); } }); var uri = 'ws://127.0.0.1:$port'; Future<WebSocket> makeClient() async { var client = await WebSocket.connect(uri); client.listen((data) { print(data); left--; if (left == 0) { got.complete(); } }); return client; } var first = await makeClient(); var second = await makeClient(); for (var socket in sockets) { socket.add('alert'); } await got.future; await first.close(); await second.close(); await httpServer.close(force: true); }

Подключите два клиента и доставьте обоим строку "sync" одним обходом списка на сервере.

Разошлите "ready" двум клиентам на localhost. В консоли каждого должна появиться эта строка.

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