我如何处理可读但不接收任何内容的套接字?

how do I handle sockets which is readable but recv nothing?

最近我在 python 上使用套接字编写了一个 http/https 代理,我使用 select 来决定套接字是否准备好接收或发送,像这样:

inputs = [sock1, sock2...]
outputs = [sock1, sock2...]
while True:
    readable, writable, exceptional = select.select(inputs, outputs, inputs)
    for s in readable:
        do something with s.recv()
    for s in writable:
        do something with s.send()

并且我注意到有时套接字是可读的,但是当我执行 s.recv() 时它 returns 是空的。而且因为我在外面有一个 while True 循环,所以它一次又一次地什么也得不到。我首先尝试关闭套接字:

data = s.recv(4096) 
if not data:
    inputs.remove(s)
    s.close()

但过了一会儿,一些套接字激活了,它们无法向我发送消息,因为我已经关闭了它。 这是否意味着我不应该关闭它?那我该怎么办呢?

当接收列表中的套接字returns recv 上的零字节时,表示套接字已从另一端关闭。它永远不会再接收数据,也应该关闭并在您这边关闭。

你这样 "some socket comes alive" - 它不是此连接另一端的套接字,那个套接字已经关闭了。