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