gpt4 book ai didi

sockets - 如何在 Dart 中处理套接字断开连接?

转载 作者:行者123 更新时间:2023-12-03 00:25:08 24 4
gpt4 key购买 nike

我在服务器上使用 Dart 1.8.5。我想实现 TCP 套接字服务器,它监听传入连接,向每个客户端发送一些数据,并在客户端断开连接时停止生成数据。

这是示例代码

void main() {
ServerSocket.bind(
InternetAddress.ANY_IP_V4,
9000).then((ServerSocket server) {
runZoned(() {
server.listen(handleClient);
}, onError: (e) {
print('Server error: $e');
});
});
}

void handleClient(Socket client) {
client.done.then((_) {
print('Stop sending');
});
print('Send data');
}

此代码接受连接并打印“发送数据”。但即使客户端消失,它也永远不会打印“停止发送”。

问题是:如何在监听器中捕获客户端断开连接?

最佳答案

Socket 是双向的,即它有一个输入流和一个输出接收器。当通过调用Socket.close()关闭输出接收器时,将调用done返回的Future。 .

如果您想在输入流关闭时收到通知,请尝试使用 Socket.drain()相反。

请参阅下面的示例。你可以用telnet测试一下。当您连接到服务器时,它将发送字符串“Send”。每一秒。当您关闭 telnet(ctrl-],然后键入 close)时。服务器将打印“Stop.”。

import 'dart:io';
import 'dart:async';

void handleClient(Socket socket) {

// Send a string to the client every second.
var timer = new Timer.periodic(
new Duration(seconds: 1),
(_) => socket.writeln('Send.'));

// Wait for the client to disconnect, stop the timer, and close the
// output sink of the socket.
socket.drain().then((_) {
print('Stop.');
timer.cancel();
socket.close();
});
}

void main() {
ServerSocket.bind(
InternetAddress.ANY_IP_V4,
9000).then((ServerSocket server) {
runZoned(() {
server.listen(handleClient);
}, onError: (e) {
print('Server error: $e');
});
});
}

关于sockets - 如何在 Dart 中处理套接字断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com