【问题标题】:How to handle socket disconnects in Dart?如何处理 Dart 中的套接字断开连接?
【发布时间】:2015-02-26 14:34:23
【问题描述】:

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

这里是示例代码

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

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

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

【问题讨论】:

标签: sockets dart


【解决方案1】:

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

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

请参见下面的示例。您可以使用 telnet 进行测试。当您连接到服务器时,它将发送字符串“Send”。每一秒。当您关闭 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');
    });
  });
}

【讨论】:

  • 我正在尝试实施您的答案。我正在发送查询,在收到查询后我需要关闭套接字。我该怎么做?
  • 当我尝试排空套接字时收到Unhandled Exception: Bad state: Stream has already been listened to.
猜你喜欢
  • 2012-08-27
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2015-05-01
相关资源
最近更新 更多