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

Обмен WebSocket-сообщениями в Dart

Полный цикл в одной программе: сервер в фоне принимает строку и отвечает, клиент подключается, шлет запрос и получает кадр в listen. Главный поток не должен завершиться раньше ответа.

Ожидание ответа удобно связать с Completer: его завершают в обработчике входящего текста, на main вызывают await у future. Печать ответа - обычный print:

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

Тот же каркас подходит для других коротких фраз. Сервер может подставить фиксированный ответ, не зависящий от текста запроса:

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

Отправьте "time" и выведите ответ "now" в консоли клиента.

Обменяйтесь фразами "ask" и "reply" в одном запуске. На экране должна появиться только строка ответа.

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