我有一个持续输出数据的设备,我想将这些数据发送到生成的同一网络上的客户端,我找不到好的解决方案。这是我正在尝试的。
服务器:
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库。
答案 0 :(得分:2)
使用UDP,每次发送数据报时都会得到一个新的“连接”,这就是您每次发送内容时都会注意到创建新对象实例的原因。你可能在这里使用了错误的协议...... UDP主要用于发送不同的“数据报”,或者当不需要更长的连接时。 TCP也称为“流”协议,通常用于没有固定端的数据。
还要记住,UDP不是一个可靠的协议,如果通过网络使用,几乎可以保证你会丢失数据包。