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 に答える