我有一个Python3服务器脚本,它运行一个TCP套接字服务器,使用select.select()检测并响应传入的数据
我使用select.select()来处理多个连接,而不使用线程,服务器主要是被动的(只等待数据并对其做出响应)。它在另一端为每个连接和设备的参数保存一个字典;每个设备的条目在其连接关闭时被删除。
我的问题是,我的客户机有时会在没有真正关闭TCP套接字的情况下丢失连接,我无法计算如何捕获或创建超时来关闭套接字并从字典中删除旧连接。
有什么好办法吗?
以下是脚本的简化副本:
host = '192.168.0.252'
port = 9989
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((host,port))
server.listen(16)
socks = [server]
devices = {}
while True:
readable,writable,exceptionavailable = select.select(socks,[],[])
for s in readable:
if(s == server):
client, address = server.accept()
socks.append(client)
else:
try: data = s.recv(1024)
except ConnectionResetError: data = 0
if data:
print(data) # Would append device to "devices" dictionary
else:
s.close()
socks.remove(s)
del(devices[did]) # did is the ID that needs deleting from dictionary
任何帮助都将不胜感激。
编辑:根据@Daniel的评论更新了更好的代码。
假设你想关闭一个连接,如果你在X秒内没有读取到它。那么你必须:
在此代码中,连接的超时设置为300秒。
注:
select
(本例中为60)的超时与连接的超时没有太大关系。它只是说你想在最多60秒后把控制权交还给你。lastread[s]
,并在关闭连接时删除密钥。更多资源:
select
的教程(link)相关问题 更多 >
编程相关推荐