0

セレクトの使い方に困っています。データを受信するためにまだそこにいるクライアントを知りたいだけです。私のコードがあります:

import socket, select

server = socket.socket()
server.bind(('localhost',80))
server.listen(1)

answer = "HTTP/1.1 200 OK\r\n"
answer+= "Content-type: text/plain\r\n"
answer+= "Connection: close\r\n"
body = "test msg"
answer+= "Content-length: %d\r\n\r\n" % len(body)
answer+= body

clients = []

while True:
  nextclient,addr = server.accept()
  clients.append(nextclient)
  clients = select.select([],clients,[],0.0)[1]
  for client in clients:
    client.send(answer)

すべてのソケットが開かれるたびに select send me が送信され、相手側で接続が閉じられた場合でも、Errno1053 が発生します: 確立された接続がホスト マシンのソフトウェアによって中止されました。

よろしくお願いします。

4

2 に答える 2

1

あなたの選択は決してブロックされません。

ゼロのタイムアウト値は、ポーリングを指定し、ブロックしません。

また、listenメソッドの引数は絶対に極端です。

socket.listen(バックログ)

ソケットへの接続をリッスンします。backlog 引数は、キューに入れられた接続の最大数を指定し、少なくとも 0 にする必要があります。最大値はシステムに依存します (通常は 5)

于 2012-05-23T00:42:53.707 に答える
0

私が知る限り、ソケットへの書き込み後にソケットを閉じることはありませんclients

clientsさらに、クライアントのリストが失われるように上書きします。一部のクライアントは処理されません。

何かのようなもの

    clients_now = select.select([],clients,[],0.0)[1]
    for client in clients_now:
        client.send(answer)
        client.close()
        clients.remove(client)

役立つかもしれません。

ところで、1 ミリ秒または 10 ミリ秒の小さなブロックだけでもサーバーの応答性は維持されますが、アイドル待機による高い CPU 負荷を防ぐことができます。

ところで2:おそらく、選択プロセスにもサーバーソケットを含める必要があります...

于 2012-05-23T08:06:26.077 に答える