2012-01-20 16 views
6

私は理解できない問題があります。私はあなたが以下の両方のアプリケーションのコードを見ることができ、AS3とツイストパイソン/上のサーバにソケットクライアントを書いて、それを理解することがStrange Flash AS3 xmlソケットの動作

あなたは両方のウィンドウと両方のウィンドウで記者接続ボタンを見ることができるようにそれらを配置し、のは、同時に2つのclientsを起動してみましょう。その後、いずれかのボタンを押し続けます。私は期待してい何

クライアントを押されたボタンでは、サーバーは、(元の送信者を含む)すべてのクライアントにこのメッセージを送信し、サーバに「いくつかのデータを」メッセージを送信します。

次に、各クライアントには、「connectButton」右ボタンを移動し、次の形式で時間をログにメッセージを出力します。「分:秒:ミリ秒」。

間違って起こっている

運動は、メッセージを送信するクライアントでは、滑らかであるが、他のすべてのクライアントに動きがぎくしゃくです。

これは、これらのクライアントへのメッセージが元の送信クライアントよりも遅れて到着するためです。そして、3つのクライアント(A、B、Cと名づけましょう)があり、Aからメッセージを送信すると、BとCの送信時刻ログは同じになります。

他のクライアントが、後に元の送信者よりも、このメッセージを受け取るのはなぜ?ところで

は、Ubuntuの10.04 /クローム上のすべての動きがスムーズです。 2つのクライアントが別々のクロムで起動します。

windows screenshot

linux screenshot

同時にログのリスト、4つのクライアント:

[16:29:33.280858] 62.140.224.1 >> some data 
[16:29:33.280912] 87.249.9.98 << some data 
[16:29:33.280970] 87.249.9.98 << some data 
[16:29:33.281025] 87.249.9.98 << some data 
[16:29:33.281079] 62.140.224.1 << some data 
[16:29:33.323267] 62.140.224.1 >> some data 
[16:29:33.323326] 87.249.9.98 << some data 
[16:29:33.323386] 87.249.9.98 << some data 
[16:29:33.323440] 87.249.9.98 << some data 
[16:29:33.323493] 62.140.224.1 << some data 
[16:29:34.123435] 62.140.224.1 >> some data 
[16:29:34.123525] 87.249.9.98 << some data 
[16:29:34.123593] 87.249.9.98 << some data 
[16:29:34.123648] 87.249.9.98 << some data 
[16:29:34.123702] 62.140.224.1 << some data 

AS3のクライアントコード、私は関連部分のみ、full code hereを残しました。

 private var socket   :XMLSocket; 

     socket = new XMLSocket(); 
     socket.addEventListener(DataEvent.DATA, dataHandler); 

     private function dataHandler(event:DataEvent):void 
     { 
      var now:Date = new Date(); 
      textField.appendText(event.data + "   time = " + now.getMinutes() + ":" + now.getSeconds() + ":" + now.getMilliseconds() + "\n"); 
      connectButton.x += 2; 
     } 

     private function keyDownHandler(event:KeyboardEvent):void 
     { 
      socket.send("some data"); 
     } 

     private function connectMouseDownHandler(event:MouseEvent):void 
     { 
      var connectAddress:String = "ep1c.org"; 
      var connectPort:Number = 13250; 

      Security.loadPolicyFile("xmlsocket://" + connectAddress + ":" + String(connectPort)); 
      socket.connect(connectAddress, connectPort); 
     } 

Python server code

+1

ここではちょっと考えましたが、SWFオブジェクトにHTMLのフォーカスがない場合、低いフレームレートで動作するという印象を受けます。これは "不安定さ"を説明しますが、ubuntu/chrome上ではうまくいきました。これは、セットアップでフラッシュプレーヤーになる可能性があります。同じマシンではなく、異なるマシン間で試してみましたか?私はぼんやりと速度が2FPSくらいまで大幅に下がることを読んで覚えています –

+0

ありがとう、私はubuntuと2つの異なるマシンを試しました。私は2つの異なるマシン(すべてのクライアントに焦点を当てています)で2つのクライアントを実行しているとき、そのクライアントはどのようにデータが不安定な動きと悪い時間ログを持っているかを質問します。 –

答えて

4

ACK delayおよび/またはNagle's algorithmの組み合わせが発生している可能性があります。これらの両方とも、TCPセッション上のデータの移動を選択的に遅延させることができ、その実装はプラットフォームによって大きく異なります。

setsockopt()TCP_NODELAYと一緒に使用して、Nagleを無効にしてみてください。

AFIK、Windowsでは、ソケット単位でACK遅延を無効にすることはできません。edit the registryを使用し、すべてのTCPに対して無効にする必要があります。だからまずTCP_NODELAYを試してみてください。それでも問題が解決しない場合は、ACK遅延を無効にして実験を行ってください。アプリケーションのレジストリ編集が実用的ではない場合でも、ACK遅延が問題であるかどうかを知るだけで、他の回避策を正しい方向に向けることができます。

+0

OMG、それは動作するようです! twisstedサーバの* connectionMade *メソッドで 'self.transport.setTcpNoDelay(True)'を設定しました。 –

1

これはちょっと遅かったのですが、これはサーバーと起動していないクライアントとの間のTCP接続をセットアップするのにかかる時間が原因と考えられます。

開始クライアントとサーバー(最初のクライアントのメッセージの前に設定されている)との間に確立されたTCP接続が既に存在しているので、3ウェイハンドシェイクの実行にかかる時間がなくなります。

あなたはこのいくつかの方法が、(例えば、それぞれにダミーのメッセージを送信することにより)取り扱いあなたの本当のメッセージの前に、接続を確立することによって、最も容易であるをテストすることができます。

各クライアントとの接続を設定したくない場合でも、TCPの信頼性を失う場合は、UDPに切り替えることもできます。

私はLinuxに関するあなたの注意を理解していません。あなたはそれがWindowsではなくLinuxで意図されたとおりに動作すると言っていますか?もしそうなら、私たちはあなたの設定についてもっと知る必要があります。たとえば、すべてのクライアントが同じホスト上で動作していますか?同じブラウザインスタンスでは?

+0

遅くはありません、ありがとうございます。データが送信される前に接続が確立されています。私は2つのクライアント(質問の冒頭にリンク)を開いて確認し、それらと遊ぶことができます。 はい、それは私がLinuxを意図した通りに動作します。同じホスト、クライアントと同じFlash Player、両方のChrome –