質問

私は、携帯電話が提供できる以上の永続性を必要とする他の TCP 接続の仲介として機能する、カスタム TCP ベースのロング ポーリング サーバーを作成しようとしています。

私がやろうとしている方法は、C# で非同期 TCP サーバーを作成し、これに対応する TCP クライアントも C# で作成することです。

(私が理解している限り) ロング ポーリングの仕組みは、サーバーへの TCP 接続を開き、ソケット経由でデータを送り返す前にサーバーが停止するというものです。携帯電話ネットワークで機能するハートビート間隔を見つけて (約 8 分が機能すると聞いたことがありますか?)、更新されたデータがない場合は空のパケットを送信します。

ここで私の悩みが生じます。クライアントのデータ要求をサーバー上で実行されているイベント ハンドラーに「リンク」する方法がわかりません…

フローは次のようになります (「クライアント」は電話上です)。

  1. ユーザーがアプリケーションを開始する

  2. クライアントはデータが変更された場合に通知を受けるリクエストを送信します

  3. サーバーは、クライアントのソケット オブジェクトを、先ほど説明したサーバーの他の TCP 接続によって呼び出される「イベント ハンドラー」に「リンク」(登録) します。

  4. イベント

    o トリガーされた場合 (新しいデータが到着した場合)、データをクライアントに送信します。

    o トリガーされない場合 (新しいデータがない場合)、「EmptyChanges」パケットをクライアントに送信します

  5. クライアントは電話でデータを受信し、それを処理します(受信したパケットの種類に基づいてイベント ハンドラーを呼び出し、サーバーから取得した「データ」をそれに渡します)。

  6. クライアントはデータが変更された場合に通知を受けるリクエストを送信します

つまり、私の問題は、私がやりたいことを実現するデザインが思いつかないことです。問題は、#3 のやり方がわからないことです。あるイベント ハンドラーを別のイベント ハンドラーから「リンク」するにはどうすればよいですか?そして、これらはほぼ確実に別のスレッドで実行されます。

したがって、私のアプリケーションは次のようになります (すべて擬似コード)。

Class AppClass
{
    Main()

    List<Client> clients;
    List<DataServers> dataServers;

    DataReceivedFromServer(Data stuff)
    {
    }

    MessageReceivedFromPhone(PhoneMessage pm, object sender)
    {
        //Loop here until HeartBeat interval reached
        Int totalTime = 0;
        While(totalTime < HEARTBEAT_INTERVAL)
        {
            If( ) // If we have received data from the server, and the client WANTED that data, send it now
            {
            }
        }
    }
}

種の?イベント駆動型にしたいのですが、PUSH 駆動型スタイルと PUSH 駆動型スタイルでアプリケーションを駆動する方法を理解するのに非常に時間がかかっています。私がポーリングに「慣れている」こと。

あまりにも複雑で愚かなことをしているかもしれないので、親切にしてください。これは、ソケット プログラミングを使用する初めての実際の試みであり (必要なかったのですが)、携帯電話の性質が一時的なネットワーク上にあり、サーバーがOPEN TCP 接続を使用してこれらの電話の位置を維持します。

サーバープラットフォーム:ウィンドウズ

サーバー言語:C#

テスト クライアント プラットフォーム:ウィンドウズ

テストクライアント言語:C#

ターゲットクライアントプラットフォーム:Windows Mobile 6.5、iPhone、Android (クライアントは別途作成します)

ターゲットクライアント言語:C#、Obj-C または MonoTouch、Java

役に立ちましたか?

解決

ただ、誰もがこれを疑問に、私は私の接続を管理するためのカスタムTCPサーバを書くのアイデアをゴミ箱に移動しました。そんなにオーバーヘッドは、私は基本的にはそう、私自身のHTTPサーバを書いて複製する代わりに、それをやっているだろう、それを行うにはありました、私は私のサーバーとしてPythonでのWebトルネードフレームワークと一緒に行きましたし、HTTPを介して通信するためのバックエンドサービスを書いていますウェブトルネードでリクエストます。

その代わりに、すべてのロングポーリングを使用して、私はプッシュ通知にSMSを使用するつもりです。私は、主要な携帯電話プラットフォームのすべてが特定の形式のSMSが伝わってくる場合、それはあなたのカスタムコードを実行されます...あなたが書いたSMSのインターセプタのようなものを実装すると信じています。これは、一貫性のあるオープン接続使用の要件削除するために私を可能にする(彗星スタイルロングポーリングを使用しますが、アクティブな場合にのみ接続が約5分間開いたままにすることができますライブチャット以外に、。)

基本的には、ウェブトルネードフレームワークは、私のアーキテクチャでのエンタープライズ・バスとして機能されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top