2

ツイストソケットと通信するiPhoneアプリケーションを作成していますが、送信するメッセージが1つある場合にうまく機能します。ただし、私の問題は、アプリにさまざまな情報を送信する必要があることです。これが私のコードです。

            if numrows == 1:
                #Did login
                msg = "%s: Login Credentials Success" % _UDID
                print msg
                for c in self.factory.clients:
                    c.message(msg)
                    time.sleep(0.5)

                for result in results:
                    for i in range(1, 6):
                        msg = "%s:L%d;%s" % (_UDID, i, result[i])
                        print msg
                        for c in self.factory.clients:
                            c.message(msg)
                            time.sleep(0.5)
            else:
                msg = "%s: Login Credentials Failed" % _UDID
                print msg
                for c in self.factory.clients:
                    c.message(msg)
                    time.sleep(0.5)

            cursor.close()
            database.close()

        #print msg

        #for c in self.factory.clients:
            #c.message(msg)

def message(self, message):
    self.transport.write(message)

最初のメッセージだけを送信することになっていて、他のすべてのメッセージが印刷と一緒に存在しなかったとします。各メッセージの下のメソッドについては、LoginCredentialsSuccessというメッセージがアプリに送信されます。しかし、あなたが見ているように残りを入れると、コードにtime.sleepを入れても、一度にすべてを送信するため、何も起こりません。

アプリは.05秒以内に応答をチェックします。ログインクレデンシャルが一番上にある場合でも、後で送信される情報が多いため、通過しませんが、クレデンシャルメッセージの後にすべての情報がないと、通過します。

私はこれに対する答えを見つけることに必死です。私は考えられるすべてを試しました。アプリは問題ではなく、Pythonです。

ありがとう。

4

2 に答える 2

2

矛盾することで気分を害するリスクがあるため、自分のアプリは問題ではないという主張を再検討することをお勧めします。各送信 TCP パケットのコンテンツを完全に制御できること、およびアプリがメッセージ境界を決定するためにパケット境界に依存していることを期待しているようです。これは、一般的にネットワーキングにとってあまり良いアプローチではありません。一部のネットワーク仲介者は途中でパケットを分割 (フラグメント) したり、さらには結合したりする可能性があり、アプリを混乱させる可能性があります。TCPはパケット プロトコルではないことに注意してください。これはストリーム プロトコルであるため、送信したオクテットが順番に受信されることが保証されているだけです。

さまざまなサイズのメッセージを処理する一般的な方法は、各メッセージの前に、次のメッセージの大きさを示す X ビットのビッグ エンディアン サイズ フィールドを付けることです。通信の受信側は最初に X ビットを読み取り、その後「size」オクテットを読み取り、完全なメッセージを取得します (その時点までブロックし、次のメッセージ ハンドラーが取得するために追加情報をバッファーに残します)。

あなたの Twisted のコードをもっと手伝ってもかまいませんが、それはすでに適切に書かれている可能性があります。少なくとも、Twisted にネットワーク書き込みバッファをすぐにフラッシュさせようとすることに依存しないことをお勧めします。コードが正しく動作しているように見せるのに役立つかもしれませんが、現時点では、後で表面化する問題を隠しているだけです。

于 2012-05-21T19:00:09.373 に答える
1

あなたの問題は、Twisted が書き込みデータをバッファリングすることのようです。

明らかに、大量のコードをリファクタリングせずにデータを強制的に送信する簡単な方法はありません。Twisted transport.writeおよびTwisted の twisted.web クラスの使用を参照してください。発信バッファーをフラッシュするにはどうすればよいですか? .

貼り付ける前にコードがどのように見えるかを知らずに、最後のリンクの受け入れられた回答によると:

  • wait受け入れられた回答と同じように関数を定義します
  • あなたのクラスがから継承していることを確認してくださいhttp.Request
  • messageメソッドを装飾するdefer.inlineCallbacks
  • メソッドの呼び出しのyield wait(N)後に (テストして決定する必要がある N の値に対して) を追加します。writemessage

これらのステップのどれが必要で、どれがあなたのコードには当てはまらない元の回答のコードから離れているかを知るのに十分な Twisted の経験がありません。

ただし、1 つのメッセージに複数の書き込みが含まれている場合に送信される種類のメッセージを受け入れるように iPhone アプリケーションを書き直すことは可能 (かつ簡単) かもしれません。

于 2012-05-20T00:59:32.347 に答える