2017-03-23 8 views
0

マルチスレッドTCPエコーサーバをPython 3.6で作成しましたが、メッセージを送信しようとするまですべて正常に動作します(サーバにメッセージを送信してエコーバックできます)受信されていない2番目のクライアントと私は2番目を送信しようとすると私にBrokenPipeエラーを与える。私はここでサイトを見回しましたが、私が見つけたのは、Python 2.7の解決策であり、ThreadingMixIn関数に言及しましたが、これはスレッドモジュールのドキュメントでは見つかりませんでした。これは私のサーバーのコードです:Python 3.6複数のクライアント用のマルチスレッドTCPエコーサーバ

#!/usr/bin/env python3 

import socket,sys,threading 

def accept_connection(tcp_socket): 
    (client_socket,(ip,port))=tcp_socket.accept() 
    print("Accepted connection from %s on port %d"%(ip,port)) 
    return (client_socket,ip,port) 

def client_action(client_socket,ip,port): 
    data=client_socket.recv(2048) 
    print("Sending back: %s to %s on %d"%(data.decode(),ip,port)) 
    client_socket.send(data) 

tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
tcp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 
tcp_socket.bind((sys.argv[1],int(sys.argv[2]))) 
tcp_socket.listen(2) 

print("Listening incoming connections...") 
(client_socket,ip,port)=accept_connection(tcp_socket) 

while True: 
    Connections_Handler=threading.Thread(target=accept_connection,args=(tcp_socket,)) 
    Connections_Handler.start() 
    Client_Handler=threading.Thread(target=client_action,args=(client_socket,ip,port,)) 
    Client_Handler.start() 
    Client_Handler.join() 

私は問題がClient_Handler.join(によってブロックされている可能性がありますclient_socketかもしれないと思う)ので、それが2番目のクライアントの新しい値を保存することはできませんが、私は」わからない。次に、私は、2つのクライアントをサーバーに「話す」ようにして、それぞれの「エコーメッセージ」を送信することができるようにしたいと考えました。 これは私のクライアントコード(それらの両方)である:私はここで間違っ

#!/usr/bin/env python3 

import socket,sys 

tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
tcp_socket.connect((sys.argv[1],int(sys.argv[2]))) 

print("Connecting to server %s on port %d..."%(sys.argv[1],int(sys.argv[2]))) 

while True: 
    message=input("Input message to send: ") 
    tcp_socket.send(message.encode()) 
    print(tcp_socket.recv(2048).decode()) 

何をやっていますか?

+0

[Python 3で変数/テキストをLAN経由で送信/同期](http://stackoverflow.com/questions/30224933/send-sync-variable-text-over-lan-in-python-3)の可能な複製 –

答えて

0

クライアントソケットを返す1つのスレッド(ConnectionsHandler)で接続を受け入れることには大きな問題があります。次に、新たに受け入れられたクライアントソケットとは無関係のクライアントソケットにデータをエコーするための第2のスレッドを開始します。

メインスレッドで呼び出しを受け入れ、データをエコーする新しいスレッドを開始する必要があります。あなたは悪いソケットを決して閉じることはありません。

受け入れたソケットを正しく使用する単一スレッドの正しいプログラムを作成し、マルチスレッド化する前に終了してください。

+0

私はあなたが言っていることを見て... Connections_Handlerを作成すると、ターゲット関数からの戻り値を保存することは可能ですか? –

+0

私はそれを理解した、私はキューを使用し、すべてが今は大丈夫です。正しい方向を指してくれてありがとう –