0

多数のクライアントにメッセージを送信する必要があるアプリケーションがあります。クライアントはユーザーのコンピューター上のアプリケーションであり、それらのアプリケーションは一度に数日実行されることがあります。サーバーに新しい命令があるか、ないかのどちらかです。2つの新しい指示の間に10分、場合によっては1時間、場合によっては1日かかることもあります。メッセージは固定長です。

これを実装するための最良の方法は何ですか?クライアントに10秒ごとにサーバーをポーリングさせる必要がありますか?新しいクライアントが接続するたびにサーバー上に新しいスレッドを作成し、新しい命令があるまで接続を維持してから、それをクライアントに送信して、クライアントに新しい接続を作成させる必要がありますか?

または、メッセージをクライアントにプッシュする必要がありますか?私はそれをどのように行うかを考えていました、そして私はこれを思いつきました:サーバーとクライアントの両方としてのサーバーサーバー。クライアントがハンドシェイクすると、そのアドレスがサーバーに渡されます。次に、サーバーはクライアントとして(そして、明らかに他のクライアントが接続できるようにするサーバーとして)機能し始め、クライアントとの接続を維持します。クライアントはサーバーのように機能し、メッセージを待ちます。

最後のものはかなり複雑に見えます。これを行うための最良の方法は何ですか?サーバーからの新しいメッセージ(「指示」)は、サーバーがそれらを「受け取った」後、少なくとも15秒後にクライアントに到着する必要があります。

ちなみに、サーバーアプリケーションはWindows上で実行されます。クライアントについてはよくわかりませんが、マルチプラットフォームを想定しましょう。サーバーアプリケーションとクライアントアプリケーションはどちらもPythonで記述されています。

御時間ありがとうございます。

4

1 に答える 1

0

各クライアントにサーバーへの接続を開いてもらい、データが読み取られるのを待ちます。サーバーは、投稿するメッセージがあるたびに、接続されているすべてのクライアントに書き込みます。

具体的には、サーバーはsocket()bind()listen()、そしてaccept()ループに入る必要があります。受け入れられた新しいクライアントごとに、接続されたソケットをアクティブなクライアントのリストに追加するだけで、まだ何も読み書きする必要はありません (該当する場合は、最初のアプリケーションレベルのハンドシェイクまたは認証を除く; そのような場合、ハンドシェークまたは認証を別のスレッド、フォークされたプロセス、または非ブロッキング イベント ループで実行して、低速のクライアントが他の進行中の認証または受け入れループをロックするのを回避する必要があります。)

クライアントはサーバーに接続し (必要に応じてハンドシェイクまたは認証を実行し)、サーバーにデータがあるまで待機する必要があります。クライアントがソケットを待機する方法は、伝統的に または のいずれpoll()かで行われますselect()。これらの呼び出しは、別のスレッドまたはプロセスでブロックする方法で実行できます。または、メイン アプリケーション ループ内または繰り返しタイマーによってトリガーされる非ブロッキングの方法で。

サーバーに投稿するメッセージがある場合は常に、接続されているクライアントのリストをループし、接続されwrite()ている各クライアントへのメッセージを実行します。

poll()クライアントは、現在または次から、またはソケットに読み取り可能なデータがあることを示して戻り、メッセージselect()に進みread()ます。

于 2013-02-24T00:03:51.460 に答える