2009-06-25 6 views
2

私は、Flex/FlashクライアントとLinux上で動作する独自のサーバーを使用してリアルタイムアプリを作成しています。TCP_NODELAYをSocket.flush()、NetConnection.call()またはsendToURL()に設定する方法はありますか?

私はFlexクライアントからリアルタイムで(ユーザーの操作に応じて)データを送信できます。私は、次の方法を試してみた:

  • flash.net.NetConnection.callを()
  • flash.net.sendToURL()
  • flash.net.Socket.write()flash.netが続きます.Socket.flush()

いずれの場合も、これらの呼び出しは、サーバーがACKを送信してからデータを再度送信するまで待機します。言い換えれば、あなたがしなければ:最初の呼び出しのためのACKを受け取ってきたまで

var nc:NetConnection; 
// Setup code left out 
nc.call("foo", someData); 
// Some more code left out 
nc.call("foo", moreData); 

上述した第2 nc.callは()サーバにデータを送信しません。私はそのACKを待つことなくすぐにデータを送信できるようにしたいと思います。

サーバーへのラウンドトリップ時間が長い場合(たとえば300ms)、サーバーにデータを1秒間に3回しか送信できません。理想的には、毎秒30回までデータを送信できるようにしたいと考えていますが、これは現在のところ約30msのRTTでのみ可能です。

サーバー自体が300ms後にデータを取得するかどうかは関係ありません - 私は光の速度を打つことはできません。

ACKを待たずにFlash Playerにデータを送信させる方法はありますか?他の環境では、これはソケット上のTCP_NODELAYフラグをセットすることによって行われますが、Flash/Flexではそのレベルの制御がないようです。

更新:私はこの問題を抱えている可能性があります。 Flash Playerは、各ブラウザの接続制限に従って、NetConnectionオブジェクトごとに別々のTCP接続を行うようにホストブラウザを設定しようとしています。 IEの場合は2です。サブドメインを使用して接続制限を回避できます(まだ試していない)ので、NetConnectionsのプールを使用してリアルタイム動作に近づけることができれば幸いです。

ありがとうございました。 http://hemlock-kills.com/

答えて

1

また、あなたの代わりにヘムロックのようなものを見ているかもしれません。これが行うことは200msの間の "最初の"書き込みを保持するので、この時間ウィンドウの中の後続の書き込みと合体することができ、ネットワークを介してパケットが少なくなることを意味します。最新のアプリケーションやネットワークエンジニアにとっては、TCP_NODELAYを設定して送信が正確に制御され、ソケットに書き込む前にバイトをバッファにまとめることができるので、これは完全に馬鹿馬鹿で不適切です。これは、アドビの誰かがRTMPプロトコルとその商用/高価なLCDSシステムに向けて人々をプッシュするためにこのオプションを制限したいと思ったからです( RTMPのサーバー側からクライアントに遅延オプションを設定することはできません)接続)。 Ahem Adob​​e、真実を掴み、Flash Ecosystemに害を与え、利益を増やさないように、TCP_NODELAYをできるだけ早く追加してください!!!

+1

ヘムロックがよく見えます。まだコードを掘り下げたわけではありませんが、描画ウィジェットを試し、パケットスニッファーを使ってXMPPを使っていることを確認しました。私はそれがフラッシュソケットを使用していると推定します。 これは、重複するパケットを送信できないという同じ問題を抱えています。次のパケットを送信する前にACKを待たなければなりません。これはFlashの制限だと思われます。 描画ウィジェットは、受け取った描画コマンドをずらすことによって、1つのバーストで描画するのではなく、巧みに補正します。 ファイアウォールやプロキシを乗り越えるには、できるだけHTTPに固執するのも良いでしょう。 – yassam

0

こんにちはソケットは、Nagleアルゴリズムがオンになっている:

関連する問題