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)

每次打开之前打开的所有套接字时,选择发送我,即使连接在另一端关闭,这也会导致 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 负载。

BTW2:也许你应该在选择过程中包括你的服务器套接字......

于 2012-05-23T08:06:26.077 回答