0

私は、携帯電話が提供できるよりも多くの永続性を必要とする他の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駆動型のスタイルでアプリケーションを駆動する方法と、ポーリングで「慣れている」方法を理解するのに非常に時間がかかっています。

これはソケットプログラミングを使用する最初の実際の試みであり(これは必要ありません)、一時的なネットワーク上にある携帯電話の性質とサーバーがOPENTCP接続でこれらの電話の場所を維持します。

サーバープラットフォーム:Windows

サーバー言語:C#

クライアントプラットフォームのテスト:Windows

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

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

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

4

1 に答える 1

0

これを不思議に思っている人は誰でも、接続を管理するためのカスタムTCPサーバーを作成するというアイデアを捨てました。これを行うには非常に多くのオーバーヘッドがあり、基本的には独自のHTTPサーバーの作成を複製するため、その代わりに、サーバーとしてPythonのWeb Tornadoフレームワークを使用し、HTTPを介して通信するバックエンドサービスを作成しています。 WebTornadoでのリクエスト。

ロングポーリングを使用する代わりに、プッシュ通知にSMSを使用します。主要な電話プラットフォームはすべて、あなたが書いたSMSインターセプターに似たものを実装していると思います...特定の形式のSMSが届くと、カスタムコードが実行されます。これにより、一貫したオープン接続を使用する必要がなくなります(ライブチャットでは、コメットスタイルのロングポーリングを使用しますが、接続は約5分間アクティブな場合にのみオープンのままになります)。

基本的に、WebTornadoフレームワークは私のアーキテクチャでエンタープライズバスとして機能しています。

于 2009-11-25T04:02:43.137 に答える