我正在创建一个 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
您创建的 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);
});