2

我有一个不断输出数据的设备,我想将该数据发送到与生成数据相同的网络上的客户端,但我没有找到一个好的解决方案。这是我正在尝试的。

服务器:

import SocketServer
from subprocess import Popen,PIPE

class Handler(SocketServer.BaseRequestHandler):
    def handle(self):
        if not hasattr(self, 'Proc'):
            self.Proc = Popen('r.sh', stdout=PIPE)
        socket = self.request[1]
        socket.sendto(self.Proc.stdout.readline(),self.client_address)

if __name__ == "__main__":                         
    HOST, PORT = "192.168.1.1", 6001

    server = SocketServer.UDPServer((HOST, PORT), Handler)
    server.serve_forever()

客户:

import socket
data = " ".join(sys.argv[1:])
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(data + "\n", ("192.168.1.1", 6001))
try:
    received = sock.recv(1024)
while True:
    print "Sent:     {}".format(data)
    print "Received: {}".format(received)
    sock.sendto('more' + "\n", ("192.168.1.1", 6001))
    received = sock.recv(1024)
except:
    print "No more messages"

用于客户端的 arg[1] 是一个程序,它输出几分钟的数据行,我需要在创建数据时对其进行处理。问题似乎是每次客户端发送另一个请求时,都会创建一个新的Handler对象,所以我松了Proc。如何流式传输 Proc.stdout?

编辑:该设备是 Korebot2,因此由于空间原因,我对其他 python 库的访问权限有限。

4

1 回答 1

2

使用 UDP,您每次发送数据报时都会获得一个新的“连接”,这就是您注意到每次发送数据时都会创建一个新对象实例的原因。您可能在这里使用了错误的协议类型...... UDP 主要用于发送不同的“数据报”,或者当不需要更长的连接时。TCP 也称为“流”协议,通常用于没有固定端的数据。

还要记住,UDP 不是一个可靠的协议,如果在网络上使用它几乎可以保证你会丢失数据包。

于 2012-10-23T02:18:31.820 回答