2016-10-25 12 views
0

Webサーバーとして動作する多数のTornadoプロセス間の通信をセットアップしたいと考えています。 tornado.web.RequestHandlerを使用してください。アイデアは、私はプロセス間で完全メッシュネットワークが必要だということです。私は4つのプロセスを持っていると私はtornado.tcpservertornado.tcpclientを使用して、それらの間の継続的な恒久的な通信を確立したい:Tornado TCPサーバー/クライアントプロセス通信

T1---T2 
| \ /| 
| \/ | 
|/\ | 
T3---T4 

私は竜巻のドキュメントで見てきた例では、しかし、TCPのプログラミングに新しいです:http://www.tornadoweb.org/en/stable/iostream.html のクラスtornado.iostream.IOStreamにソケットが確立されると、すべての通信が完了してからソケットが閉じられます。この例では、コールバックが通信の義務を果たすブロックを介してコードを実行します。

しかし、TCP接続を開き、クライアントがサーバに書き込むときにのみBaseIOStream.read_until_close()をアイドル状態にして呼び出すことは可能ですか?

つまり、クライアントとサーバーは接続されたままになり、クライアントがサーバーに書き込みを行うと、何らかの理由でTornado IOLoopがread()を呼び出すのを中断しますか?

私の考えは間違っています。これを行う方法は、通信するプロセスが必要なたびに新しいTCP接続を確立し、作業を行い、接続を切断します。それはちょうど)(

+0

基本的に私は、TCPServerにWebSocketHandler.on_message()と同等のものがあるのだろうかと疑問に思っています。 –

答えて

2

の再開始はここで基本的な実装ですいる必要はありません。 (私はそれが生産品質だと約束することはできません!)ファイルに保存して、このような何かを実行し、別の端末ウィンドウ内の各:

> python myscript.py 10001 10002 10003 
> python myscript.py 10002 10003 10001 
> python myscript.py 10003 10001 10002 

最初の引数はリスニングポートで、残りの引数は、他のサーバーのポートです。

私たちはread_until_closeを呼び出さないので、メッセージが完全に受信されたときを知る方法が必要です。私は、メッセージの残りの部分の長さをエンコードする各メッセージの先頭に32ビット整数でこれを行います。

「クライアントがサーバーに書き込みを行うと、何らかの理由でTornado IOLoopがread()を呼び出すのを中断しますか?」という質問が表示されました。これはTornadoのIOLoopのためのものであり、 "非同期"という意味です:多くのTornadoコルーチンまたはコールバックはネットワークイベントを待つことができ、IOLoopは待っているイベントが起きたときに目を覚まします。上記のコードで "利回り"が表示されているところであれば、それは起こります。

+0

Ahh Iジェシーを参照してください!したがって、無限ループ内のread_bytes()は、書き込まれる情報があるまで生成されます。ありがとう、私はあなたの例を深く掘り下げて実行します。無関係のint型アプローチを使用した理由は一目瞭然です。好奇心をそそられるのは意味がありますか?私はread_byt()の代わりにread_until()を代用できると仮定しています...もう一度ありがとう! –

+1

'read_until'は受信したすべてのデータを検索して区切り文字を探しなければならないので、大きなメッセージに対しては高価になる可能性があります。必要なプロトコルを設計することができれば、読み取る必要があるバイト数を知るプロトコルを設計することで、より優れたパフォーマンスが得られます。 –

+0

こんにちはJesse私は非同期と待機を使用するコードを変更すると、このプログラムでいくつかの非常に奇妙な結果を得ています。私はアサーションエラーを取得し続け、 'MyServer.handle_stream'は決して待たれていないことを警告しています...あなたは、問題がawaitとasyncを使用するために上記のものを変更することを知っていますか? –

1

しかし、それはTCP接続を開き、BaseIOStream.read_until_closeを持つことが可能です...多くのオーバーヘッドが含まれます。この新しい接続を毎回確立するのではなく、オープンな接続を残すように思えますアイドル状態になり、クライアントがサーバーに書き込むときにのみ呼び出されますか?

竜巻については認識していません。しかし、TCPに関しては、接続が確立されると(サーバとクライアントは状態を 'ESTABLISHED'として維持する)、サーバとクライアントは、誰かが接続を閉じるまで、またはメッセージを送信させるネットワーク問題が発生するまでデータを交換できる他端に達することはありません。

つまり、クライアントとサーバーの滞在が接続されており、クライアントがサーバに書き込むときには、何らかの形での読み取りを呼び出すためのトルネードIOLoopは()割り込み?

はい。これは事実です。

それとも私の見当違いの考え、これを行う方法は、私は、新しいTCPコネクションを確立する仕事をして、接続を殺す通信するプロセスを必要とするたびにあるのですか?

号には、すべてのデータ交換は、TCPコネクション

+0

Prabhuのコメントありがとうございますが、私はこれがTornadoフレームワークでどのように具体的に達成できるのか知りたいです... –

関連する問題