2

クライアント アプリケーションにデータをプッシュしたい。クライアント アプリは、シックまたはシンにすることができます。プッシュはインターネット経由で行う必要があります。これはどのように行うことができますか?

EDIT: クライアントアプリがサーバーへの接続を開き、それを存続期間中維持し、その接続を介してデータを受信し続ける方法はありますか. このようなものを構築できますか?どんな助けでも大歓迎です。

更新:私のシック クライアントは Wpf になり、私のシン クライアントは Silverlight アプリになります。レイテンシーを最小限に抑えたい。また、特定のカテゴリのデータでは、更新頻度が 1 秒あたり 10 回を超えます。既製のものが存在しない場合は、そのようなソリューションを構築しても問題ありません。いくつかのポインタ/アイデアを開始したいだけです。

4

7 に答える 7

2

まず、いくつかの質問を自問する必要があります。

  • 私の「クライアント」は Web ブラウザですか、それとも実行可能ファイルですか?
  • サーバーに接続するクライアントの数は?
  • クライアントにデータが送信される頻度は?
  • クライアントがすぐにデータを受信すること (1 秒または 2 秒の遅延ではなく) はどれほど重要ですか?

クライアントが Web ブラウザーの場合、オプションはさらに制限されます。ガイダンスについては、 Cometを参照してください。他の誰かが言及したように、 ASP.NET で Comet を実行する方法を説明する良いブログ投稿があります

多くのクライアントを想定していない場合は、クライアントからサーバーへの接続を開くことが実行可能な解決策になる可能性があります。情報と基本的な例については、次の MSDN ページを参照してください。 - TcpListener - TcpClient

多くのクライアント (サーバー ハードウェアによっては 50 以上) が予想される場合、オプションは他の質問への回答によって異なります。

クライアントが頻繁にデータを取得し、短い (数秒) の遅延が許容される場合、ポーリングは簡単な解決策です。クライアントから実装を非表示にして、データがプッシュされているように見せることができますが、実際にはクライアントにスレッドがあります。数秒ごとにポーリングします。

クライアントがデータをあまり頻繁に取得しない場合は、Cometのようなものが良い選択肢になる可能性があります。.NET ソリューションを探している場合は、「Long Polling WCF」を検索してください。

更新: クライアントが Silverlight であると述べたので、次のブログ投稿を強くお勧めします。

  • ソケットを使用してサーバーからデータを送信する ( herehereおよびhere )
  • WCF Duplex Service を使用したデータの送信 (ここここ)

WCF Duplex Service は、設定されたメッセージと応答を使用するという点で優れているため、テキストまたはバイナリ データを自分で解析する必要はありません。これは基本的に、Comet for Silverlight のバージョンです。

于 2009-11-29T13:32:04.003 に答える
2

クライアントがサーバーへのソケットを開くと、無期限に開いたままにすることができます。ときどきキープアライブ パケットをいくつか送信するようにしてください。そうしないと、「スマート」ルーターが接続を切断する可能性があります。

はい、できます!

于 2009-11-29T13:07:57.060 に答える
0

簡単な答えは、ポーリングを使用することです。

この質問は非常に似ています:

クライアントへのasp.net httpサーバープッシュ

于 2009-11-29T12:19:15.833 に答える
0

I suggest you use Comet. Check out the following article and example.

于 2009-11-29T12:34:14.683 に答える
0

今年の初めにこれを行う必要がありましたが、このコンピューターでコードが見つかりません。このSOリンクは役に立ちますか?

更新:これを入手する必要があったときに使用した記事を見つけました。警告は 3.5 を使用しており、WCF だと思います。Keyvan Nayyeri の記事からコピーしたコード:

        OperationContext context = OperationContext.Current;
        MessageProperties messageProperties = context.IncomingMessageProperties;
        RemoteEndpointMessageProperty endpointProperty =
            messageProperties[RemoteEndpointMessageProperty.Name]
            as RemoteEndpointMessageProperty;

        return string.Format("Hello {0}! Your IP address is {1} and your port is {2}",
            value, endpointProperty.Address, endpointProperty.Port);
于 2009-11-29T12:34:30.780 に答える
0

最善の解決策は、Kragen が提案するようなポーリングを使用することです。これにより、まれにデータを送信するためだけに存在するアイドル セッションでサーバーが滞ることがなくなります。ポーリングは同じ機能を提供しますが、クライアントごとに 1 つのスレッドが必要であることに加えて、サーバーに一定の負荷がかかることはありません (サーバーが apache などのようにクライアントごとにスレッドを生成すると仮定します)。シン クライアント (ブラウザー内で実行) を使用すると、AJAX を使用して、ページの絶え間ないリロードを防ぐことができます。シック クライアント内の場合は、同じことを行うことができますが、バックグラウンドの時間イベントを使用してリクエストを送信します。

ファット クライアントのシナリオでサーバーからクライアントにデータをプッシュする必要がある場合、最善の解決策は、クライアントにリッスン ソケットを開くことです。サーバーからの要求をクライアントにプッシュする必要がある場合、サーバーはクライアントとリクエストを送信します(認証時に、サーバーはユーザーIPが接続を開始することを記録します)。シン クライアントのシナリオ (Web ブラウザ経由) では、これは不可能ではないにしても非常に困難です (適切なセキュリティ ポリシーが使用されている場合)。

なぜこれを行おうとしているのかについて、より詳細な説明を提供することをお勧めします。これにより、ニーズに合ったより「的を絞った」ソリューションを提供できるようになります。

于 2009-11-29T13:11:59.407 に答える
-1

クライアントにサーバーの更新をチェックさせ、データをプルさせる方法はたくさんあります (ファイルの場合は標準の ftp プロトコルを使用し、WCF、Web サービスなどの他の通信プロトコルを使用する場合)。 ) この方法では、ファイアウォールや nat について心配する必要はありません。

コメントを表示しています-クライアントがnatの背後にある場合、静的ルーティングなしでは不可能であるため、難しいでしょう-これがあなたのケースである場合、プッシュすることはできません...クライアント側から接続を開く必要があります.

于 2009-11-29T12:18:58.253 に答える