尽管客户端失去了网络连接,但BaseHTTPServer仍在写入



我已经实现了一个接受请求的服务器,经过一些处理后,客户端连接到我的服务器
服务器不断向客户端发送数据,但如果客户端失去网络连接(例如,在我的手机上,我在没有退出客户端程序的情况下禁用了互联网访问(,则服务器仍在写入nothing
我已经附上了我的代码逻辑的缩短版本。监视输入数据可能是个好主意,但在某些情况下,我不必等待任何输入。

class CustomRequestHandler(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
BaseHTTPRequestHandler.__init__(self, request, client_address, server)
def do_GET(self):
try:
readable, writable, exceptional = select.select([self.rfile], [self.wfile], [self.rfile, self.wfile], 0)
for s in readable:
print (s.readline())
for s in writable: # 
s.write(b"Data")
except Exception as e:
print(e)

def finish(self, *args, **kw):
print ("Do finish")
class CustomServer(socketserver.ThreadingMixIn, HTTPServer):
pass

def start_server():
httpd = CustomServer((HOST, PORT), CustomRequestHandler)
try:
httpd.allow_reuse_address = True
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.server_close()

if __name__ == '__main__':
start_server()

过了一段时间,writable变成了一个空列表,但我如何检测客户端是否发生了网络丢失?我怎样才能发现网络错误?

切断网络连接时,套接字未关闭。只有当操作系统决定套接字超时时,发送器才会得到通知。这通常需要30s以上。

另一方面,如果接收器程序正确关闭,发送器将在几毫秒内收到通知。

这些保持开放但实际上丢失的连接是网络编程中的一个主要问题。有缓解措施,但没有通用的最终解决方案

最新更新