Python 2.7、Windows XP。我有一个向客户端发送消息的服务器。我使用 select 模块来检查套接字是否准备好接收,以及捕获异常情况。我的印象是,如果客户端关闭了套接字, select() 会在异常条件套接字列表中返回所述套接字,但它似乎没有这样做:
lin, lout, lex = select.select(socklist, socklist, socklist)
for sock in lin:
# handle incoming messages
for sock in lout:
# send updates
for sock in lex:
# shut down server-side objects for particular client
服务器确定客户端是否仍然连接的最佳方法是什么?服务器并不总是发送数据,所以我不想依赖 socket.send() 来测试客户端是否仍然存在。
关闭的套接字不是异常(错误)情况。将会发生的情况是,套接字将位于读取列表 (lin) 中,并且当您读取时,您将获得 0 字节。这意味着另一端已关闭套接字。
Update:
在正常实践中,您永远不会在 except 列表中看到任何内容,并且可以安全地忽略它。它适用于很少使用的东西,例如带外(OOB)等。
回答问题更新:
可靠且快速地检测到插座的另一端已消失可能很棘手。如果可靠、始终、及时地检测它很重要,那么您应该使用更高级别的机制,例如 keepalive/heartbeat。
如果客户端干净地关闭了套接字,那么您应该在读取列表中看到该套接字。从套接字读取将返回 0 字节,表示套接字已关闭 (EOF)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)