gpt4 book ai didi

flutter - Dart 如何实现连续输出的 web-socket

转载 作者:行者123 更新时间:2023-12-05 05:56:45 26 4
gpt4 key购买 nike

如何实现服务端向客户端持续输出数据。例如,服务端收到客户端的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');
}

最佳答案

我认为如果套接字忙于无限循环,我认为您当前的方法会阻止更多客户端使用套接字。您最好的选择是使用周期性流,它将在给定的时间间隔内发出消息,这样它仍然可以监听 future 的客户端。

服务器:

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..');
}

关于flutter - Dart 如何实现连续输出的 web-socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69082056/

26 4 0
文章推荐: python - botocore.exceptions.ConnectTimeoutError : Connect timeout on endpoint URL
文章推荐: aws-application-load-balancer - 基于 ALB 入口 Controller 路径的路由
文章推荐: kubernetes - 当 kubectl 将生命周期修补到容器时,请求无效
文章推荐: html - 用户选择时