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

Сервер WebSocket в Dart

Сервер создают через HttpServer.bind на InternetAddress.loopbackIPv4 с портом 0, чтобы ОС выдала свободный номер. После привязки номер порта читают у httpServer.port. На каждый запрос в listen проверяют WebSocketTransformer.isUpgradeRequest.

Текст от клиента приходит в колбеке socket.listen. Ответ на то же соединение шлют через socket.add у объекта WebSocket после WebSocketTransformer.upgrade:

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(data); done.complete(); }); } }); var client = await WebSocket.connect( 'ws://127.0.0.1:$port', ); client.listen((data) {}); 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(data); done.complete(); }); } }); var client = await WebSocket.connect( 'ws://127.0.0.1:$port', ); client.listen((data) {}); client.add('order 7'); await done.future; await client.close(); await httpServer.close(force: true); }

На входящую строку "check" сервер должен вернуть ту же строку клиенту на localhost.

На запрос "version" ответ сервера в кадре должен совпадать с текстом запроса.

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