2017-09-08 23 views
0

サーバ側で2つのソケット(異なるポートを使用)を使用して、publisher0を使用して単一のクライアント(サブスクライバ)に非同期でデータをストリーミングします。 :センサーのサンプリングレートが異なっていますが、私はこの特定のケースの開始コードを見つけることができませんでしたが、selectを使うことを示唆しているので、答えが見つかりました。 :2つのファイルを開始した後、コードは加入者と出版社側の両方であっハング、何もプリントアウトされていないマルチソケット(非同期)

publisher.py

import socket 
import select 

sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock1.bind(('', 23000)) 
sock2.bind(('', 23001)) 

sock1.listen(1) 
sock2.listen(1) 
clisock1, (remhost, remport) = sock1.accept() 
clisock2, (remhost, remport) = sock2.accept() 
clisocks = [clisock1, clisock2] 
while 1: 

    ready_socks,_,_ = select.select(clisocks, [], []) 
    for sock in ready_socks: 

     sock.send(b"Hello World\n") 

clisock1.close() 
clisock2.close() 

subscriber.py

import socket 
import select 

sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

sock1.connect(('', 23000)) 
sock2.connect(('', 23001)) 

socks = [sock1, sock2] 

while True: 
    ready_socks,_,_ = select.select(socks, [], []) 
    for sock in ready_socks: 
     data, addr = sock.recvfrom(100) # This is will not block 
     print("received message:", data) 

私は途方に暮れています、と私は非常にいくつかの提案をいただければ幸いです。

答えて

1

あなたが直面している問題は、送信ソケットを間違ったリストに入れていることによるものです。 select.select()には、受信リストと送信リストの2つのリストがあります。第2の戻りではこのように、あなたが代わりに送信ソケットは第二引数と準備ソケットとして入力されている

_,ready_socks,_ = select.select([], socks, []) 

を読むためpublisher.pyにライン

ready_socks,_,_ = select.select(socks, [], []) 

を更新する必要があります値。これを更新すると、プログラムが動作します。ただし、プログラムの遅延がないので、大量のメッセージをすばやく送信します。また、書かれているように、2つのチャンネルを区別する方法はありません。私はそれがあなたの例を減らすことによると思います。

+0

ありがとうございます+100。私はあなたが提案した変更を行いました:コードは今働いています。 – JMarc