Несколько WebSocket-сообщений в Dart
Пока соединение открыто, клиент может вызывать
add несколько раз подряд. Сервер получает
каждый кадр отдельным вызовом колбека
listen; ответы тоже шлют по одному на кадр.
Приемник на стороне сервера считает сообщения в
логике обработчика или накапливает счетчик. Клиент
ждет нужное число ответов через Completer:
import 'dart:async';
import 'dart:io';
void main() async {
var left = 3;
var received = 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) {
print(data);
left--;
if (left == 0) {
received.complete();
}
});
}
});
var client = await WebSocket.connect(
'ws://127.0.0.1:$port',
);
client.listen((data) {});
for (var word in ['one', 'two', 'three']) {
client.add(word);
}
await received.future;
await client.close();
await httpServer.close(force: true);
}
Если сервер на каждый кадр отвечает строкой, клиент
снижает счетчик в listen и печатает
ответы по мере прихода:
import 'dart:async';
import 'dart:io';
void main() async {
var left = 2;
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('echo $data');
});
}
});
var client = await WebSocket.connect(
'ws://127.0.0.1:$port',
);
client.listen((data) {
print(data);
left--;
if (left == 0) {
done.complete();
}
});
client.add('a');
client.add('b');
await done.future;
await client.close();
await httpServer.close(force: true);
}
Передайте пять кадров с текстами "n1" …
"n5". Сервер выведет пять строк по
одной на кадр.
Примите три запроса и на каждый верните
"ok". Клиент выведет три строки
ответа.