Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
希望在Python中模拟socat的功能_Python_Socketserver_Socat - Fatal编程技术网

希望在Python中模拟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

我需要使用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 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连接。无论如何谢谢。谢谢你的建议,但是做出这些改变并没有改变结果,服务器似乎仍然没有收到任何消息。