如何处理Dart中的套接字断开连接?
我在服务器上使用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来测试它。 当你连接到服务器时,它会发送字符串“发送”。 每一秒。 当你关闭telnet(ctrl-],然后键入close)。 服务器将打印“停止”。
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');
});
});
}
链接地址: http://www.djcxy.com/p/84019.html
上一篇: How to handle socket disconnects in Dart?
下一篇: Passing a context containing properties to a TypeConverter