2016-10-04 162 views
0

我需要使用python将字符串发送到localhost上的特定端口。正在模拟Python中socat的功能

我可以通过使用像这样的命令行上socat实现这一目标:

cat <text file containing string to send> | socat stdin tcp-connect:127.0.0.1:55559 

我不想作为一个子命令运行socat命令,所以我想知道如何得到这个工作使用python模块。

我尝试使用套接字失败。下面是我正在使用的脚本,它没有达到预期的效果。

import socket 
    HOST, PORT = "127.0.0.1", 55559 
    jsonString = '{"name":"VideoStreamStatus","parameters":{"name":"video_0_0"}}' 

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    try: 
     # Connect to server and send data 
     print "Attempting connection" 
     sock.connect((HOST, PORT)) 
     print "Sending json string" 
     sock.sendall(jsonString) 
     print "String sent" 

    finally: 
     sock.close() 

    print "Sent:  {}".format(jsonString) 

python脚本执行时没有任何错误,但对正在接收socat数据的进程没有任何影响。下面的Python脚本输出:

Attempting connection 
    Sending json string 
    Sent:  {"name":"VideoStreamStatus","parameters":{"name":"video_0_0"}} 

有什么,我在插座脚本做错了还是有不同的方法,我可以在Python中使用?我会很感激任何建议。谢谢。

编辑:我试图发送字符串的服务器是C++程序的一部分,它使用boost asio acceptor来侦听特定地址和端口上的tcp连接。

+0

您的代码对我来说非常适合。我的服务器'nc -l 55559',在其stdout上显示json字符串。请描述您使用的服务器,以及是什么让您认为“*对接收社区数据的流程没有任何影响”。 –

+0

@Robᵩ我试图发送字符串的服务器是使用boost asio acceptor侦听特定地址和端口上的tcp连接的C++程序的一部分。 – BlooMeth

回答

0

原来是很简单的东西。我使用socat(服务器正在接收和处理成功)发送的字符串在结尾处有换行符。我通过python套接字发送的字符串没有新行。在python脚本的末尾添加新行后,服务器会按预期收到该字符串。

我才意识到,有一个接一个换行符,而不是运行一个Python脚本,服务器监听在不同的端口和发送使用这两种方法后的字符串其他。

0

根据the socat man page

当一个信道已达到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() 
+0

对结果没有任何影响。不管怎么说,还是要谢谢你。 – BlooMeth

0

你写入套接字后,不应立即关闭套接字:关闭可能会吞下未发送的数据。

正确的工作流程是所谓的graceful shutdown

  • 想要关闭连接部分采用了关机写在插座上,并保持阅读
  • 另一部分检测到0字节从被认为是文件结尾的套接字读取。它关闭其插座
  • 发起者检测到0字节读,可以安全地关闭套接字

所以finally部分变为:

finally: 
    try: 
    sock.shutdown(socket.SHUT_WR) 
    while True: 
     dummy = sock.recv(1024) 
     if len(dummy) == 0: break 
    finally: 
    sock.close() 
+0

感谢您的建议,但使这些更改没有改变结果,服务器似乎仍然没有收到任何消息。 – BlooMeth