Закрытие 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". На клиенте
напечатайте эту причину.