【发布时间】:2018-04-05 16:32:57
【问题描述】:
我正在通过 TCP 与一台实验室设备进行通信。该设备有一个命令集,将回复每个命令,确认已收到命令以及命令中请求的任何数据。问题在于,当使用例如socket.recv() 或其任何变体在我send() 一个命令之后从设备获取响应时,该方法在any 时返回收到数据,而不是收到我想要/期望的所有数据。这会导致某些数据不在我预期的 recv() 调用中,而是出现在下一次调用中。
我正在考虑的一个解决方案是将接收到的数据与发送的数据完全分开/异步处理,并在使用重复的recv() 调用时对其进行解析,但是当我想象可能存在一个使用我对接收到的数据的了解的简单方法(例如,它总是以回车和换行结束,但我不知道消息有多长)等到收到整个消息并且不再.
总结一下:有没有一种现有的方法可以通过 TCP 以更可控的方式接收数据,以便数据在我期望的地方结束?
【问题讨论】:
-
这就是 TCP 的工作原理。 TCP sockets are streams of bytes, not streams of messages. 如果你想要一个消息流,你必须在
recv周围的循环(或异步回调,或其他)之上构建它,以及实现你选择的一些消息框架协议的缓冲区和代码。跨度> -
我只是好奇是否有预构建的方法来处理框架,可能来自我可以安装的更高级别的库或包。我不认为我所描述的是一个新问题,我只是有点惊讶我没有找到我正在寻找的东西。
-
有一百万种协议,从简单的网络字符串或 jsonlines 到像 xmlrpc over http 这样的协议。加上六种实现协议处理的方法,这取决于您首先如何从网络中读取数据(使用或不使用线程的阻塞读取、选择循环、回调、异步......)。大多数组合都有一个标准库或第三方库来完成大部分工作,但首先你必须选择一个。
标签: python python-3.x sockets tcp buffering