python - Python:一次为多个客户端设置超时
问题描述
我的代码是直接的服务器-客户端交互,其中从客户端发送消息,服务器根据消息执行任务。服务器通过每个端口一个客户端和每个客户端一个线程来允许多个客户端。问题在于超时,因为如果没有找到客户端,套接字应该在一段时间后超时。这是客户端服务器的代码,省略了不相关的代码:
socks = []
for port in ports:
sock = socket.socket()
sock.settimeout(20)
sock.bind((host, port))
sock.listen()
socks.append(sock)
while True:
r, w, x = select.select(socks, [], [])
for s in r:
(conn, addr) = s.accept()
t = threading.Thread(target = doTasks, args = (conn))
t.start()
for sock in socks:
sock.close()
如果我理解timeout
正确,它应该accept
排在行前,但是当我让服务器空闲而不连接任何客户端时,它似乎没有正确超时,只是挂起。我已经能够timeout
在一个只允许一个客户端的更简单的服务器上工作:
s = socket.socket()
try:
s.settimeout(10)
s.bind((host, port))
s.listen()
print('Listening at', port)
while True:
(self.conn, self.addr) = s.accept() #accept client requests
t = threading.Thread(target = doTasks)
t.start()
s.close()
except socket.timeout:
print('socket timed out')
我在这个讨论中读到它可能更适合使用time.time()
,尽管我想知道我是否仍然在settimeout()
错误地使用。
解决方案
推荐阅读
- vue.js - 将图像上传到 Firebase 商店后设置 Vuetify 循环进度条值
- haskell - 在请求之间共享 http 管理器
- optimization - 如何提高密码查询的运行时间
- windows - 通过bat文件在ansicon控制台打开jar文件
- playframework - 如何将 mvc.play.Result 转换为 JsonNode 或 String
- android - android上的Nativescript蓝牙只是发现一些设备并慢慢做
- javascript - 单击时需要冻结动画对象
- android - 实际信号强度为空时如何显示自定义信号强度UI?
- php - Laravel API 架构 - 最佳实践
- java - jssc SerialPort - 我的软件在读取字节时停止运行