Sockets 如何处理Dart中的插座断开?

Sockets 如何处理Dart中的插座断开?,sockets,dart,Sockets,Dart,我正在服务器上使用Dart 1.8.5。 我想实现TCP套接字服务器,它侦听传入的连接,向每个客户端发送一些数据,并在客户端断开连接时停止生成数据 下面是示例代码 void main(){ ServerSocket.bind( InternetAddress.ANY_IP_V4, 然后((服务器套接字服务器){ 运行分区(){ 监听(handleClient); },onError:(e){ 打印('Server error:$e'); }); }); } 无效handleClient(套接字客

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

下面是示例代码

void main(){
ServerSocket.bind(
InternetAddress.ANY_IP_V4,
然后((服务器套接字服务器){
运行分区(){
监听(handleClient);
},onError:(e){
打印('Server error:$e');
});
});
}
无效handleClient(套接字客户端){
客户端。完成。然后(){
打印(“停止发送”);
});
打印(“发送数据”);
}
此代码接受连接并打印“发送数据”。但即使客户端不在,它也不会打印“停止发送”


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

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

如果希望在输入流关闭时收到通知,请尝试改用

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

导入'dart:io';
导入“dart:async”;
无效手持客户端(插座){
//每秒向客户端发送一个字符串。
var定时器=新定时器。周期性(
新的持续时间(秒:1),
()=>socket.writeln('Send');
//等待客户端断开连接,停止计时器,然后关闭
//插座的输出接收器。
socket.drain()然后((){
打印('停止');
timer.cancel();
socket.close();
});
}
void main(){
ServerSocket.bind(
InternetAddress.ANY_IP_V4,
然后((服务器套接字服务器){
运行分区(){
监听(handleClient);
},onError:(e){
打印('Server error:$e');
});
});
}

在我看来,这就像一个bug。请创建一个问题,您可以在我的答案中看到示例。它显示
停止发送
,详细说明Dart SDK中发现的问题。我正在尝试实现您的答案。我正在发送查询,在收到查询后,我需要关闭套接字。我该怎么做?