首页 > 解决方案 > 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()错误地使用。

标签: pythonsocketsserver

解决方案


推荐阅读