当前位置: 首页 > 知识库问答 >
问题:

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

何博涛
2023-03-14

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

下面是示例代码

dart prettyprint-override">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');
}

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

问题是:如何捕捉侦听器中的客户端断开?

共有1个答案

仲孙诚
2023-03-14

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

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

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

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');
    });
  });
}
 类似资料:
  • 当我在电子中运行 socket.io 时,我在开发人员控制台中不断收到此错误。 当我建立它时,插座总是立即断开。我的客户甚至没有得到socket.emit我在连接一建立就得到,直到一两分钟后。 客户端和服务器位于同一版本的socket.io上。 服务器: 客户: 这不是完整的代码,但除了一些其他不应影响连接的侦听器之外,没有其他与websockets交互的内容。 服务器没有显示任何问题。它告诉我每

  • 我试图创建群聊android应用程序和使用Websocket服务器编写的PHP。这个服务器在Web浏览器上工作得很好,但当我试图在android应用程序中使用它时,应用程序一连接就断开了。 这里是Android代码:

  • 我试图了解Socketchannes和NIO的总体情况。我知道如何使用常规套接字,以及如何为每个客户机服务器创建一个简单的线程(使用常规阻塞套接字)。 所以我的问题是: 什么是袜子通道 当我使用SocketChannel而不是Socket时,额外得到了什么 通道和缓冲区之间的关系是什么 什么是选择器 文档中的第一句话是

  • 在 linux 内核中你会发现很多关于中断和异常处理的话题 中断和中断处理 Part 1. - 描述中断处理主题 深入 Linux 内核中的中断 - 这部分开始描述和初步步骤相关的中断和异常处理。 初步中断处理 - 描述初步中断处理。 中断处理 - fourth part describes first non-early interrupt handlers. 异常处理的实现 - 一些异常处理的

  • 问题内容: StackExchange.Redis的“ 基本用法”文档解释说,该方法是长期存在的,有望重新使用。 但是,当与服务器的连接断开时该怎么办?是否自动重新连接,或者是否有必要像此答案一样编写代码(引用该答案): 上面的代码是处理断开连接恢复的好方法,还是实际上会导致多个实例?同样,该属性应如何解释? [另外:我相信上面的代码是惰性初始化的一种非常糟糕的形式,尤其是在多线程环境中-请参阅

  • 我正在编写一个netty/websocket服务器应用程序,其中对websockent客户端(例如浏览器)的写入来自另一个线程(即不是来自websockets)。 这是netty4.0.18.Final,我的应用程序在很大程度上基于提供的websocket服务器示例。 我需要知道websocket通道何时打开,以便我可以保存ChannelHandlerContext,以便其他线程可以执行写入。我有