飞镖和颤振中套接字类的不同行为



我有两个简短的代码片段,仅用于测试通过TCP套接字的通信。

在 Dart 中,我有以下代码,它可以很好地编译并成功将命令发送到连接到我的 arduino 的 esp8266:

import 'dart:io';
void main() async {
Socket socket = await Socket.connect('192.168.2.123', 80);
String command = "<2,1,>";
socket.write(command);
print(socket.port);
await Future.delayed(Duration(seconds: 1));
socket.close();
}

在 Flutter 中,绑定到 on Pressed 方法的以下代码片段不会成功执行命令:

class _MyStartScreenState extends State<MyStartScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: FlatButton(
color: Colors.orange,
onPressed: _sendCommandToEsp,
child: Text("On/Off"),
)
),
);
}

void _sendCommandToEsp() async{
Socket socket = await Socket.connect('192.168.2.123', 80);

String command = "<2,1,>";
socket.write(command);

await Future.delayed(Duration(seconds: 1));

socket.close();
}

}

有什么明显的东西我没有得到吗?我不知道为什么会这样。帮助将不胜感激!

如果您阅读Socketclose的文档,您会发现以下注释:

注意:对 IOSink 的写入可能会被缓冲,并且可能不会通过调用close()来刷新。要刷新所有缓冲写入,请在调用close()之前调用flush()

https://api.dart.dev/stable/dart-io/Socket/close.html

您当前的行为似乎在不同平台上工作的原因可能是因为每个操作系统中的网络堆栈不同,并且 Flutter 的Socket类实现可能与您在 Dart VM 中运行时不同。

但是,您当前的代码依赖于未记录的行为,因此最好使用flush()方法并等待返回的Future,以便您确定数据在运行之前实际发送close()这将破坏缓冲区中尚未发送的任何数据。

好的,问题是我使用了一个数字小于 1024 的端口,这在大多数情况下需要根 permisiion。当我将端口切换到更高的端口时,代码开始工作,但它仍然似乎是随机的(至少我找不到模式(,当命令从 esp8266 接收

到时,当它没有收到时。我将使用带有延迟的循环函数对此进行测试。

最新更新