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

Несколько WebSocket-сообщений в Dart

Пока соединение открыто, клиент может вызывать add несколько раз подряд. Сервер получает каждый кадр отдельным вызовом колбека listen; ответы тоже шлют по одному на кадр.

Приемник на стороне сервера считает сообщения в логике обработчика или накапливает счетчик. Клиент ждет нужное число ответов через Completer:

import 'dart:async'; import 'dart:io'; void main() async { var left = 3; var received = 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, ); socket.listen((data) { print(data); left--; if (left == 0) { received.complete(); } }); } }); var client = await WebSocket.connect( 'ws://127.0.0.1:$port', ); client.listen((data) {}); for (var word in ['one', 'two', 'three']) { client.add(word); } await received.future; await client.close(); await httpServer.close(force: true); }

Если сервер на каждый кадр отвечает строкой, клиент снижает счетчик в listen и печатает ответы по мере прихода:

import 'dart:async'; import 'dart:io'; void main() async { var left = 2; var done = 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, ); socket.listen((data) { socket.add('echo $data'); }); } }); var client = await WebSocket.connect( 'ws://127.0.0.1:$port', ); client.listen((data) { print(data); left--; if (left == 0) { done.complete(); } }); client.add('a'); client.add('b'); await done.future; await client.close(); await httpServer.close(force: true); }

Передайте пять кадров с текстами "n1" … "n5". Сервер выведет пять строк по одной на кадр.

Примите три запроса и на каждый верните "ok". Клиент выведет три строки ответа.

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