Рассылка по WebSocket в Dart
В dart:io нет готового метода
broadcast: хранят список открытых
WebSocket и при рассылке вызывают
add у каждого элемента. Это удобно для
уведомлений, когда адресатов несколько и ответ не
привязан к одному входящему кадру.
Два клиента подключаются к одному порту на
127.0.0.1; после рукопожатия сервер
обходит список сокетов. Каждый клиент получает
строку в своем listen:
import 'dart:async';
import 'dart:io';
void main() async {
var sockets = <WebSocket>[];
var left = 2;
var got = 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,
);
sockets.add(socket);
socket.done.then((_) {
sockets.remove(socket);
});
}
});
var uri = 'ws://127.0.0.1:$port';
Future<WebSocket> makeClient() async {
var client = await WebSocket.connect(uri);
client.listen((data) {
print(data);
left--;
if (left == 0) {
got.complete();
}
});
return client;
}
var first = await makeClient();
var second = await makeClient();
for (var socket in sockets) {
socket.add('news');
}
await got.future;
await first.close();
await second.close();
await httpServer.close(force: true);
}
Текст рассылки может быть любым на английском. Главное - дождаться подключения всех клиентов, затем один раз обойти список сокетов:
import 'dart:async';
import 'dart:io';
void main() async {
var sockets = <WebSocket>[];
var left = 2;
var got = 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,
);
sockets.add(socket);
socket.done.then((_) {
sockets.remove(socket);
});
}
});
var uri = 'ws://127.0.0.1:$port';
Future<WebSocket> makeClient() async {
var client = await WebSocket.connect(uri);
client.listen((data) {
print(data);
left--;
if (left == 0) {
got.complete();
}
});
return client;
}
var first = await makeClient();
var second = await makeClient();
for (var socket in sockets) {
socket.add('alert');
}
await got.future;
await first.close();
await second.close();
await httpServer.close(force: true);
}
Подключите два клиента и доставьте обоим строку
"sync" одним обходом списка на сервере.
Разошлите "ready" двум клиентам на
localhost. В консоли каждого должна появиться
эта строка.