2017-11-20 10 views
0

からメッセージを送信:PythonのSocketServer私は、このクラスを実装するPythonでTCPサーバ、使用するサーバー

class ThreadedTCPServer(SocketServer.ThreadingTCPServer): 
    pass 

それの通常の使用は、(そうで、サーバーを開始する要求を処理して)完璧な作品を。

今、TcpRequestHandler(SocketServer.BaseRequestHandler)クラスのhandle機能以外のクライアントにメッセージを送信する必要があります。

私は、サーバーの内部ソケットを使用して、次のトリック、(それはUDPのために働く)使用しようとした - 私はそう

tcp_server.client_socket.send(message) 

をしかし、私は

socket.error: [Errno 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied 

message-このエラーが出ますTCPでは不可能であると仮定します。

他の方法はありますか? 私はいくつかのサーバーがクライアントにメッセージを送信する必要があると思っています(それは要求に対する応答ではない)が、良い方法を見つけることができませんでした。

ありがとうございます!

答えて

2

あなたはTCPを持つ2つの一般的なオプションがあります。

  1. はバンド(OOB)のうち、クライアントにメッセージを送信します。この場合、サーバーはクライアントに個別に接続し、役割は逆になります。クライアントはポート上でOOBメッセージをリスンする必要があり、この点でサーバとして機能します。あなたの問題の説明から、あなたはこれをしたくありません。これは問題ありません。
  2. 受信メッセージに応答してサーバーがクライアントにメッセージを送信できるプロトコルを実装します。余分なメッセージと期待される戻り値を開始メッセージに多重化する方法が必要です。これをサーバー上の共有キューで実装できます。ハンドラ以外のこのキューにメッセージを入れ、ハンドラがキューから消費するメッセージにハンドラが応答すると、そのメッセージを応答に挿入します。

興味があるように聞こえる場合は、後でサンプルコードを書くことができます。

賛否両方のアプローチの間に&短所があります:あなたが管理するより多くのソケット接続を持っているし、あなたが望むいない可能性があります接続にクライアントホストを公開(1)では

が。プロトコルは多重化されていないので簡単です。

In(2)では、TCPストリームは1つしかありませんが、OOBメッセージを多重化する必要があります。また、クライアントが定期的にサーバーに接続していない場合は、待ち時間が長くなります。

希望に役立ちます。

関連する問題