TCP Server中有没有客户端断开连接时触发的东西?

问题描述 投票:0回答:1

我正在创建一个 TCP 服务器,如下所示。当客户端连接时,我将其添加到列表中。它工作顺利。但我不知道如何知道客户端是否自行断开连接。如果服务器故意断开连接,则会触发“client.done.then”字段。有这样的事件处理程序吗?

  Future<void> startServer(String ipAddress, int port) async {
server = await ServerSocket.bind(ipAddress, port);
server.listen((Socket client) {
  print(
      'Client connected: ${client.remoteAddress.address}:${client.remotePort}');
  addDevice(client);
  client.listen((data) {
    String dataString = utf8.decode(data);
    print(dataString);
  });

  client.done.then((value) {
    print(
        'Client disconnected: ${client.remoteAddress.address}:${client.remotePort}');
    removeDevice(client); // Bağlantı kesildiğinde cihazı listeden kaldır
  });
});

setState(() {
  isConnected = true;
});

}

此外,当我关闭服务器时,客户端不会收到连接的客户端已关闭的通知。当我想按如下方式关闭它时,出现错误。

  void stopServer() {
for (Socket client in connectedDevices) {
  client.close();
}
server.close();
setState(() {
  isConnected = false;
});

}

操作系统错误:传输端点未连接,errno = 107

flutter tcpserver
1个回答
0
投票

您创建的 TCP 连接在 Dart 中作为 stream 实现,它为传入数据发出事件。当客户端断开连接时,流将关闭,从而触发

done
事件。要定义该事件的回调,您可以在调用流的
listen 方法
时将函数作为 onDone 命名参数传递。所以你可以重写你的代码如下:

client.listen((data) {
  String dataString = utf8.decode(data);
  print(dataString);
}, onDone: () {
  print('Client disconnected: ${client.remoteAddress.address}:${client.remotePort}');
  removeDevice(client);
});
© www.soinside.com 2019 - 2024. All rights reserved.