2

私は、ソケット、スレッド(多分)、およびasycoreモジュール(多分)の使用方法を学ぶためにグループチャットアプリケーションを開発しています。私の考えは、クライアントがサーバーに接続すると、サーバーがクライアントに他の接続のリスト(他のクライアントの「ユーザー名」、ip addres)を送信し、人が1つ以上に接続できるようにするクライアントサーバーアーキテクチャを持っていることでした。一度に人がいて、サーバーはクライアント間にP2P接続をセットアップします。ソケット部分は機能していますが、サーバーは一度に1つのクライアント接続しか処理できません。
複数の接続を処理するための最良の、最も一般的な、実用的な方法は何でしょうか?新しい接続がサーバーに接続されてから異なるクライアント接続を接続するたびに新しいプロセス/スレッドを作成しますか、それともサーバーが同じデータを複数のソケット(接続)に送信するようにするasycoreモジュールを使用しますか?データの行き先を調整するだけです。

どんな助け/考え/アドバイスもいただければ幸いです。

4

1 に答える 1

1

グループチャットアプリケーションの場合、一般的なアプローチは次のとおりです。

サーバー側(プロセスを受け入れる):

  • ソケットを作成し、それを既知のポート(および適切なインターフェイス)にバインドして、リッスンします
  • 一方(app_running)
    • Client_socket = accept(serverSocketを使用)
    • 新しいスレッドを生成し、このソケットをスレッドに渡します。そのスレッドは、接続したばかりのクライアントを処理します。
    • サーバーがさらに多くの接続を受け入れ続けることができるように、続行します。

サーバー側のクライアント管理スレッド:

  • app_running中:
    • 着信メッセージを読み、キューなどに保存します。
    • 継続する

サーバー側(グループチャット処理):

  • 接続されているすべてのクライアントの場合:
    • キューを確認してください。メッセージが存在する場合は、接続されているすべてのクライアントに送信します(このメッセージを送信したクライアントを含む-ACKのようなものとして機能します)

クライアント側:

  • ソケットを作成する
  • IPアドレスとポートを介してサーバーに接続します
  • 送信/受信します。

上記には多くの改善があります。サーバーがソケットをポーリングしたり、ソケットのグループに対して「選択」操作を使用したりできるように。これにより、接続されているクライアントごとに個別のスレッドを使用すると、多数の場合に過剰摂取になるという意味で効率的になります。(スタックのスレッドごとに最大1MBを考えてください)。

PS:私は実際にasyncoreモジュールを使用していません。ただし、接続されているクライアントが多く、処理が非常に少ない場合は、パフォーマンスが向上することに気付くと思います

于 2012-07-30T16:29:00.493 に答える