2012-05-02 7 views
4

私は、既存のpythonアプリケーションへのネットワークサービスを作成するために深いところに投げ込まれたPython(2.6/2.7)の初心者です。python UDPサーバーを強化する

私はUDPサーバを稼働していますが、うまく動作しますが、少し弾力を増強するための助けを求めています。ここで

は、私が書かれているベースコード、通常の標準ボイラープレートです:

import sys 
import socket 
from threading import Thread 

def handleInput(): 
     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     sock.bind(("127.0.0.1",5005)) 
     # socket always binded? 
     while True: 
       data, addr = sock.recvfrom(512) 
       # is 'data' usable? 

t=Thread(target=handleInput) 
t.daemon=True 
t.start() 
# can thread die? 

はまず、私はそれはそうそこに、耳を傾けていなくても、ソケットは常に感覚で利用可能であることを理解します失敗したようなものではなく、あなたは再接続する必要があります。これは正しいです?

第2に、recvfromから返されたデータに関する問題。それは簡単ですか'データの場合:'は有効かどうかを確認しますか?

最後に、スレッドです。スレッドを爆発させることはできますか?もしそれが再起動する最良の方法は何ですか?

その他のヒントをお待ちしております。

(注:私は外部のライブラリを使用することはできません、例えばねじれなど)

+1

上記の「スレッド」コードで何を達成したいと思いますか?それは、単に 'handleInput()'を実行する以上の価値はありませんが、スクリプト全体は、1つのクライアントで終了するまでブロックされます。あなたは複数の "クライアント"を同時に扱うことを望んでいますか? –

+0

このコードは、別のpythonアプリケーションに挿入されます。そのスレッドの理由です。並行処理に関しては、複数のクライアントからのメッセージはすべてキューに入れられませんか? – kingsaul

答えて

4

ご質問のためのいくつかの答え:

  1. UDPソケットはコネクションレスであり、そのような「いつでも利用できる」など。また、UDPメッセージの長さは、65535バイトのIIRCに制限されています。
  2. データは単なる文字列であり、その有効性は使用されるプロトコルによって異なります。 if data: ...は何かを受信するためのテストとして動作しますが、何かを受信するまではrecvfrom()コールがブロックされ、余分なものに見えます。
  3. 私は一般的にpythonスレッドの信頼性について知りません。

SocketServerモジュールと関連するUDPServerクラスもチェックします。これは実装が簡単になるようにします。 SocketServerは、Pythonの標準ライブラリの一部です。

+1

理論的には、IPデータグラムの最大サイズは65535バイトで、IPヘッダーの16ビットの合計長フィールドによって課されます。 20バイトのIPヘッダーと8バイトのUDPヘッダーを使用すると、UDPデータグラムには最大65507バイトのユーザーデータが残ります。しかし、ほとんどの実装では、この最大値を下回ります。 –

関連する問題