Ubuntu:将未缓冲的原始数据通过管道传输到 TCP 端口

问题描述

我的总体目标: 我有一个硬件设备,可以将传感器数据传输到运行 Python 脚本的 Ubuntu 笔记本电脑。数据每 2 秒以 240 个样本(每行一个,带有 \n)的块形式出现并打印到标准输出。我在 Ubuntu 笔记本电脑上启动 Python 脚本,并使用 netcat 将其输出通过管道传输到 TCP 端口。我从网络上的任何其他设备连接到该 TCP 端口并获取实时数据流 - 无需先加载所有以前的样本

我的设置: 两台笔记本电脑。

1:Ubuntu 从传感器收集读数,并将这些读数通过管道传输到 TCP 端口 1234。(这是有效的。)$ py read_sensors.py | nc -lk 1234

2:Windows 10,具有 WSL、Python 和用于处理从第一台笔记本电脑流式传输的数据的现有脚本。 (这在 WSL 中有效)$ nc 10.10.10.01 1234

我的问题: 我开始在 Ubuntu 笔记本电脑上传输传感器数据。 10 分钟后,我从 Windows 笔记本电脑连接到该流...

我希望在建立连接时收到最新的样本,以及(伪)实时的所有后续样本。

相反,一旦我连接上,我就会收到自我在 Ubuntu 笔记本电脑上开始流式传输管道以来收集的所有样本,一旦它赶上来,我就会开始看到实时数据。

我尝试过: 搜索使我尝试了 stdbuf。由于缺乏结果,我尝试了 $ stdbuf -oL py read_sensors.py | nc -lk 1234 $ py read_sensors.py | stdbuf -oL nc -lk 1234 的各种组合,但每次我稍等片刻然后从我的 Windows 笔记本电脑连接到端口时,它就会加载从我开始在Ubuntu 笔记本电脑。

我假设:这是一个缓冲问题,必须在 Ubuntu 机器上修复 - 但是 stdbuf 的各种组合对系统的行为没有任何影响。所以,我向诸神寻求洞察力和恩典:)

-尼克

解决方法

这样的事情可能会达到总体目标。基于https://docs.python.org/3/library/socketserver.html#socketserver-tcpserver-example

import socketserver

class MyHandler(socketserver.BaseRequestHandler):
    def handle(self):
        bytes = read_sensor_data() # call the code that reads the sensors                                
        self.request.sendall(bytes)

if __name__ == "__main__":
    with socketserver.TCPServer(("localhost",1234),MyHandler) as server:
        server.serve_forever()
,

禁用 netcat 缓冲:

Force netcat to send messages immediately (without buffering)

或者,我相信如果您使用 bash 的内置 tcp 连接绕过 netcat,它会起作用。例如。 read_sensors.py > /dev/tcp/10.10.10.1/1234

编辑:添加了显示如何发送和接收的示例代码。

示例代码:

发送:

#!/bin/bash
while true
do
   date  > /dev/tcp/localhost/1234 || true # replace date command with read_sensors.py
   sleep 1
done

接收:

ubuntu@ubuntu:~$ nc -lk 1234

输出:

Tue Mar  2 20:40:24 UTC 2021
Tue Mar  2 20:40:25 UTC 2021
Tue Mar  2 20:40:26 UTC 2021
Tue Mar  2 20:40:27 UTC 2021
^C
ubuntu@ubuntu:~$ nc -lk 1234
Tue Mar  2 20:40:40 UTC 2021
Tue Mar  2 20:40:41 UTC 2021

注意,当我点击控件 C 时有 13 秒的间隔,没有数据发送或缓冲。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...