Dart如何实现连续输出web套接字



如何实现数据从服务器到客户端的连续输出。例如,服务器接收到客户端的start命令后,一直向客户端输出当前时间,直到服务器接收到quit命令。

问题:

  1. 为什么服务器收不到quit命令
  2. 为什么只有第一个客户端可以接收到来自服务器的连续输出消息

我在Dart中的代码是

服务器:

import 'dart:io';
main() async {
var running = true;
var q = 'quit';
var p;
final port = 8080;

var webSocketTransformer = WebSocketTransformer();

HttpServer server = await HttpServer.bind(InternetAddress.anyIPv6, port);
server.transform(webSocketTransformer).listen((WebSocket webSocket) {
print('WebSocket opened.');
webSocket.listen((_) {
q = _;
print(_);
}, onError: (err) {
running = false;
print(err);
}, onDone: () {
running = false;
print('WebSocket closed.');
});
while (running && p != q) {
sleep(Duration(seconds: 1));
webSocket.add(DateTime.now().toString());
}
});
print('Listening..');
}

客户:

import 'dart:io';
import 'package:web_socket_channel/io.dart';
void main(List<String> arguments) {
final url = 'ws://localhost:8080';
final channel = IOWebSocketChannel.connect(url);
channel.sink.add('start');
channel.stream.listen((msg) {
print(msg);
});
sleep(Duration(seconds: 30));
channel.sink.add('quit');
}

我认为你目前的方法将阻止从进一步的客户端套接字,如果它在一个无限循环中忙碌。你最好的选择是使用周期流,它将在给定的间隔发出消息,这样它仍然可以侦听未来的客户端。

服务器:

import 'dart:io';
import 'dart:async';
main() async {
final port = 8080;

var webSocketTransformer = WebSocketTransformer();
// Use a periodic stream that emits events at a given interval
Stream<int> streamPeriodic =
Stream.periodic(const Duration(milliseconds: 1000), (count) {
return count;
});
late StreamSubscription<int> subscription;
bool openSocket = false;
HttpServer server = await HttpServer.bind(InternetAddress.anyIPv6, port);
server.transform(webSocketTransformer).listen((WebSocket webSocket) {
print('WebSocket opened.');

webSocket.listen( (event) {
if (!openSocket) {
subscription = streamPeriodic.listen((event) {
webSocket.add(DateTime.now().toString());
});
openSocket = true;
}
else {
event as String;
if (event == 'start') {
subscription.resume();
}
else if (event == 'quit') {
subscription.pause();  
}
}
});         
});
print('Listening..');
}

最新更新