希望在Python中模拟socat的功能
我需要使用python将字符串发送到localhost上的特定端口 我可以通过在命令行上使用socat来实现这一点,如下所示:希望在Python中模拟socat的功能,python,socketserver,socat,Python,Socketserver,Socat,我需要使用python将字符串发送到localhost上的特定端口 我可以通过在命令行上使用socat来实现这一点,如下所示: cat <text file containing string to send> | socat stdin tcp-connect:127.0.0.1:55559 python脚本执行时没有任何错误,但对接收socat数据的进程没有任何影响。Python脚本输出如下: Attempting connection Sending json
cat <text file containing string to send> | socat stdin tcp-connect:127.0.0.1:55559
python脚本执行时没有任何错误,但对接收socat数据的进程没有任何影响。Python脚本输出如下:
Attempting connection
Sending json string
Sent: {"name":"VideoStreamStatus","parameters":{"name":"video_0_0"}}
套接字脚本中有什么地方我做错了吗?或者在Python中有其他方法可以使用吗?如果有任何建议,我将不胜感激。谢谢
< >编辑:我尝试发送字符串的服务器是使用Boost ASIO接受程序来侦听特定地址和端口上的TCP连接的C++程序的一部分。
当一个通道达到EOF时,另一个通道的写入部分关闭。然后,socat在终止前等待timeout
秒。默认值为0.5秒
也许您需要将收盘时间推迟0.5秒,如下所示:
finally:
#sock.close()
sock.shutdown(socket.SHUT_WR)
time.sleep(0.5)
sock.close()
finally:
#sock.close()
sock.shutdown(socket.SHUT_WR)
sock.recv(999999)
sock.close()
或者,您可能需要接收服务器的关闭消息,如下所示:
finally:
#sock.close()
sock.shutdown(socket.SHUT_WR)
time.sleep(0.5)
sock.close()
finally:
#sock.close()
sock.shutdown(socket.SHUT_WR)
sock.recv(999999)
sock.close()
在写入套接字后,决不能立即关闭套接字:关闭可能会吞下尚未发送的数据 正确的工作流程称为:
- 想要关闭连接的部分在套接字上使用关机写入并继续读取
- 另一部分检测到从套接字读取的0字节,该套接字被视为文件的结尾。它关闭它的插座
- 启动器检测到0字节的读取,可以安全地关闭套接字
最后
部分变成:
finally:
try:
sock.shutdown(socket.SHUT_WR)
while True:
dummy = sock.recv(1024)
if len(dummy) == 0: break
finally:
sock.close()
结果证明这是一件非常简单的事情。我使用socat发送的字符串(服务器正在成功接收和处理该字符串)的末尾有一个换行符。我通过python套接字发送的字符串没有新行。在python脚本的末尾添加新行后,服务器将按预期接收字符串
在运行一个python服务器脚本在不同的端口上侦听并使用这两种方法发送字符串后,我才意识到一行接一行,而不是另一行。您的代码对我来说非常适合。我的服务器,
nc-l55559
,在其标准输出上显示json字符串。请描述您正在使用的服务器,以及是什么让您认为“对接收socat数据的过程没有任何影响”。@Robᵩ 我试图发送字符串的服务器是使用Boost ASIO接受程序的C++程序的一部分,以侦听特定地址和端口上的TCP连接。无论如何谢谢。谢谢你的建议,但是做出这些改变并没有改变结果,服务器似乎仍然没有收到任何消息。