Сервер 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" ответ сервера в
кадре должен совпадать с текстом запроса.