Обмен 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" в одном запуске. На экране
должна появиться только строка ответа.