2012-10-23 97 views
2

我有一个连续输出数据的设备,我想将数据发送到同一网络上的客户端,因为它产生了,我找不到一个好的解决方案。这是我正在尝试的。通过网络使用python流式传输连续数据

服务器:

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库。

回答

2

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

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