2017-03-18 32 views
0

私は以下のプロジェクトに取り組んでいます。TCP IPクライアント(WPF GUI)とTCP IPサーバー(Python)を作成しました。この問題の焦点はサーバーにあります。現時点では、クライアントからサーバーにメッセージを送信することができ、サーバーはクライアントにメッセージを返します。TCP IPソケットとマルチスレッド

プロセスと私はarchieveたい:

  • クライアント:サーバーがメッセージを受信:

  • サーバーを(ボタン ステータスが変化したときなど)、サーバーにeventbasedメッセージを送ります サーバーはクライアントにデータを継続的に送信する必要があります(たとえば、 現在のセンサー値をクライアントに1秒間に送信します)。サーバーは もクライアントからの新しいメッセージに反応し、 その他のものを行う必要があります。

問題:

  • paralelleプロセス:受信メッセージとカント 何か(データ= conn.recv(1024))を行うためのサーバーが待機。だから私は 複数のメッセージをクライアントに送り返すことができません。クライアントへ
  • メインループの複数のデータを送信します

    1. は、クライアント
    2. からのデータを受信:

私の最初のアイデアは、二つのスレッドを使用していた他のものを行う、スレッドを開始し

私の質問:正しい方法でスレッドを使用していますか?私はTCP IPとスレッドの使用経験はあまりありません。ご協力ありがとうございました。

サーバーの私の現在のコード:

from threading import Thread 
import socket 
data ='' 
HOST ='192.168.0.108' # Server IP or Hostname 
PORT = 12345 # Pick an open Port (1000+ recommended), must match the client sport 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print 'Socket created' 

def ReceiveAndSendData(): 
#managing error exception 
    try: 
     s.bind((HOST, PORT)) 
    except socket.error: 
     print 'Bind failed ' 

    print 'Wait for connection' 
    s.listen(5) 
    (conn, addr) = s.accept() 
    print 'Connected' 

    # awaiting for message 

    while True: 
     print'start' 
     try: 
      print 'awaiting data from GUI' 
      if not data: break 
      data = conn.recv(1024) 
      print 'Received data: ' + data 
      reply = 'Received data' 
      conn.send(reply) 
     except socket.error: 
      print 'Connection lost' 
      print 'Wait for connection' 
      s.listen(5) 
      (conn, addr) = s.accept() 
      print 'Connected' 
    conn.close() # Close connections 



def Main(): 
    t1 = Thread(target=ReceiveAndSendData) 
    t1.start() 
    print 'DoSomething' 

if __name__ == '__main__': 
    Main() 

答えて

0

あなたは電流遮断方法を使用するか、非同期に行くことができます。私は非同期メソッドを好むだろうが、あなたがTCPとスレッドに慣れていないので、ブロッキング解決策があなたにとってより明確になるかもしれない。ところで、非同期ではスレッドを追加する必要はなく、ほとんどのアクションはコールバックによって処理されます。

ブロッキングソリューション:正しいです、3つのスレッドが必要です。

  • 1:メインスレッド
    • スタート他のスレッド、コンフィグ、コンソール、データを処理するなど
  • 2:送信者スレッド
    • スレッドはただ座っていると、同期キューに耳を傾けます。同期されたキューはスレッドセーフなので、他のmutexやロックは必要ありません。デッドロックやその他の奇妙なシナリオは発生しません。
    • 新しいパケット(送信される)がキューに入れられると、このスレッドはそれを処理し、他のパケットを処理し続けるか、しっかりと座って次のパケットを待ちます。
  • 3:レシーバスレッド
    • バイト数が利用可能である、あなたは、パケットを読み、そのハンドラに渡します。
    • ハンドラがパケットをクライアントに送り返したい場合、パケットを同期キューに入れ、送信スレッドによって処理されます。受信スレッドはハングしませんし、受信を続けることができます。

私はそれは間違いなく、今日行くための方法です、あなたは非同期TCP上で研究を続ける示唆しています。

+0

有用な回答ありがとうございます。今度はサーバーがasync.hを実行します。私はこのコードを使用しました:https://pymotw.com/2/asyncore/#servers –

関連する問題