私は、携帯電話が提供できるよりも多くの永続性を必要とする他のTCP接続の仲介役として機能するカスタムTCPベースの長いポーリングサーバーを作成しようとしています。
私がやろうとしている方法は、C#で非同期TCPサーバーを作成し、それに対応するTCPクライアントもC#で作成することです。
長いポーリングが機能する方法(私が理解している限り)は、サーバーへのTCP接続を開き、サーバーがソケットを介してデータを送り返す前に停止することです。携帯電話ネットワークで機能するハートビート間隔を見つけ(約8分が機能すると聞きましたか?)、更新されたデータがない場合は空のパケットを送信します。
ここで問題が発生します。サーバーで実行されているイベントハンドラーを使用して、クライアントのデータ要求を「リンク」する方法がわかりません…
フローは次のようになります(「クライアント」は電話上にあります)。
ユーザーがアプリケーションを起動します
クライアントは、データが変更された場合に通知を受け取るリクエストを送信します
サーバーは、クライアントのソケットオブジェクトを「イベントハンドラー」に「リンク」(登録)します。このハンドラーは、私が説明したサーバーの他のTCP接続によって呼び出されます。
イベント
oトリガーされた場合(新しいデータが到着した場合)、データをクライアントに送信します
oトリガーされない(新しいデータがない)場合は、「EmptyChanges」パケットをクライアントに送信します
クライアントは電話でデータを受信して処理します(受信したパケットのタイプに基づいてイベントハンドラーを呼び出し、サーバーから取得した「データ」をサーバーに渡します)
クライアントは、データが変更された場合に通知を受け取るリクエストを送信します
ですから、私の問題は、自分がやりたいことを実現するデザインが思いつかないということです。問題は、#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