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

Закрытие WebSocket в Dart

Соединение закрывают явно: у клиента вызывают close, HTTP-сервер останавливают через httpServer.close с force: true. Протокол передает код и краткую причину; в dart:io о них сообщают поля closeCode и closeReason после завершения done.

После обмена клиент закрывает сокет. В колбеке onDone у listen печатают причину и сигнализируют main через Completer:

import 'dart:async'; import 'dart:io'; void main() async { var closed = Completer<void>(); var httpServer = await HttpServer.bind( InternetAddress.loopbackIPv4, 0, ); var port = httpServer.port; httpServer.listen((request) async { if (WebSocketTransformer.isUpgradeRequest( request, )) { await WebSocketTransformer.upgrade(request); } }); var client = await WebSocket.connect( 'ws://127.0.0.1:$port', ); client.listen( (data) {}, onDone: () { print(client.closeReason); closed.complete(); }, ); client.add('bye'); await client.close(); await closed.future; await httpServer.close(force: true); }

Сервер тоже может закрыть конкретное соединение из обработчика кадра, тогда onDone сработает на клиенте. Порядок завершения - сначала закрыть клиентов, затем close у HTTP-сервера:

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

После одного сообщения завершите соединение со стороны клиента. В onDone выведите причину закрытия.

Сервер закрывает клиента с причиной "ok" после кадра "done". На клиенте напечатайте эту причину.

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