1

リモートサーバーに接続するスクリプトがあります。コードは以下です

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((remote_host,remote_port))
s.setblocking(False)


while True:
    try:
        data = s.recv(1024)

        if not data:
           break

        pkt_type = ord(data[2]) # get pkt type

        if pkt_type == Reset:
           s.send(data)

        if pkt_type == Authenticate:
           processAuthenticate(s,data)
           break

    except:
        pass

while(True)
 .
 .
 .

リセットを待ってサーバーにエコーバックし、次に認証パケットを待ち、少しいじってサーバーにエコーバックします。これが正常に完了すると、サーバーからデータを要求できるようになります。これは、次の while(true) ループで行われます。

これがこれを行う最良の方法ですか。スクリプトを実行するとエラーが発生することがあります。例外を処理し、次のワイル ループの実行を防ぐ最も簡単な方法は何ですか?

ありがとう

4

3 に答える 3

1

有限状態マシン (FSM) は、この種のことを行う標準的な方法です。Python で FSM を実行するための良いリファレンスは次のとおりです: http://wiki.python.org/moin/FiniteStateMachine

于 2010-01-20T09:48:33.693 に答える
0

編集: ここでは FSM が便利なはずです。

実際には、 Twisted Reactorを見てみることをお勧めします- 自分自身は (まだ) 使っていませんが、FSM とイベント ループ (あなたのwhile-ループは本質的にです)

編集2:

いくつかのメモ (完全なコードを待っている間)

  1. 2連続だという事実while(true)は、まあ、奇妙です
  2. おそらく、except:ステートメントの前にステートメントを上if not dataに移動してpasscontinue
  3. ord(data[2])バイナリ プロトコルを使用していることを示唆している場合は、代わりにstructモジュールの使用を検討する必要があります。unpack()pack()
于 2010-01-20T09:32:13.873 に答える
0

上記のヒントに加えて、データをバッファリングする必要があります。ストリーム プロトコルを使用する場合、recv の 1 回の呼び出しで必要なすべてのデータを取得できるとは限りません。代わりに、recv から読み取ったものをバッファーに追加し、バッファーを調べて、メッセージのすべてのデータがまだ含まれているかどうかを確認する必要があります。存在する場合は、メッセージを抽出して処理し、残りのバッファで繰り返します。それ以上メッセージを抽出できない場合は、戻ってソケットからさらに読み取ります。

于 2010-01-20T11:45:13.033 に答える