0

私はチャットサーバーのものを作ろうとしています。基本的に、複数のクライアントが同時に接続できるようにしたいです。

いつも聞いているので欲しいです。誰かが接続しようとすると、即座にそれらを受け入れ、接続のリストに追加します。

listen(1)とタイムアウトを設定し、それらをリストに追加し続け、ソケットを閉じて、新しいソケットを作成し、タイムアウトでリッスンするなどの方法があります。ただし、これは非常に遅いようで、私はそうではありません。それがうまくいくことさえ確かに

覚えておいてください、それはソケットである必要はありません。他の種類のネットワークインターフェイスがあれば、それも同様に機能します。

4

4 に答える 4

3

システムのメモリに基づいて、ソケットの最大数に実際的な制限があります。

http://docs.python.org/2/library/socketserver.htmlを参照してください。最後のいくつかの例(非同期ミックスインの下)は、達成したいものに非常に近いと思います。

于 2012-11-14T22:12:45.590 に答える
2

接続ごとに個別のソケットを実際に維持する必要があるかどうかを検討してください。コネクションレス型UDPのようなものが適切でしょうか?そうすれば、1つのOSソケットだけを使用しながら、任意の数のユーザーをサポートできます。

もちろん、このアプローチでは、接続セマンティクスを内部的に維持する必要があります(アプリケーションがそのようなことを気にする場合)。IP /ポートを確認するか、ネットワークプロトコル内のエンベロープデータを調べて、各データグラムが送信されたユーザーを特定し、ときどきpingを送信して、反対側がまだ生きているかどうかを確認します。ただし、このアプローチでは、ユーザーを適切に分離できます。あらゆるOSの懸念からRE:プロセスが一度に開いたままにしておくことができるソケットの数。

于 2012-11-14T22:19:22.347 に答える
1

あなたは問題を少し間違って見ています。サーバー側のソケットを使用すると、同じソケットへの接続を受け入れ、他のプロセス/スレッドによって処理されます。

#
# Setup socket and other handling stuff here
#

while True:
    conn = sock.accept()
    thread.start_new_thread(handler, (conn,))
于 2012-11-14T22:43:17.683 に答える
0

いつも聞いているので欲しいです。誰かが接続しようとすると、即座にそれらを受け入れ、接続のリストに追加します。

だからあなたはただ持っています:

  1. 新しい接続をaccept()し、それぞれを処理するために新しいスレッドを開始するだけのaccept()ループ。

  2. セッションのアイドルタイムアウトをどのようにしたいかに関係なく、長いタイムアウトで読み取る接続ごとのスレッド。タイムアウトが経過した場合は、ソケットを閉じてスレッドを終了します。

サーバーがFDを使い果たした場合(十分な同時接続がある場合)、accept()は対応するerrnoで失敗し始めます。この場合、それを無視してループを続けます。たぶん、この状況でアイドルタイムアウトを減らし、acceptsが再び機能し始めたときにそれを元に戻します。

于 2012-11-15T00:24:31.227 に答える