Python 2.7:侦听请求的连接+;同时侦听已建立的连接

Python 2.7:侦听请求的连接+;同时侦听已建立的连接,python,python-2.7,networking,server,Python,Python 2.7,Networking,Server,我目前正在尝试制作聊天室服务器。我正试图做到这一点,这样我就可以同时监听新请求的连接和已建立的连接发送的消息 我可以用它来监听请求的连接: def reqlisten(): global hostlist while True: conn, address = (sock.accept) hostlist.append(conn) print 'Recieved connection form', address def mesl

我目前正在尝试制作聊天室服务器。我正试图做到这一点,这样我就可以同时监听新请求的连接和已建立的连接发送的消息

我可以用它来监听请求的连接:

def reqlisten():
    global hostlist
    while True:
        conn, address = (sock.accept)
        hostlist.append(conn)
        print 'Recieved connection form', address
def meslisten():
    global hostlist
    while True:
        ready_socks,_,_ = select.select(hostlist, [], [])
        for sock in ready_socks:
            data, addr = sock.recvfrom(255)
            print 'Received message:', data
            broadcast(message)
            print 'Broadcasting message.'
我可以用它来监听从已经建立的连接发送的消息:

def reqlisten():
    global hostlist
    while True:
        conn, address = (sock.accept)
        hostlist.append(conn)
        print 'Recieved connection form', address
def meslisten():
    global hostlist
    while True:
        ready_socks,_,_ = select.select(hostlist, [], [])
        for sock in ready_socks:
            data, addr = sock.recvfrom(255)
            print 'Received message:', data
            broadcast(message)
            print 'Broadcasting message.'

但是我如何同时做这两件事呢?

有多种方法可以做到这一点

  • 一种简单的方法是,通过异步将套接字设置为非阻塞,一次接受一个连接,并在接受的套接字上接收固定数量的连接 下面是这样做的示例代码

    hostlist = []
    def Accept(sock):
        ##Accept one connection at a time                                                                                                                                                                                                        
        conn,address = sock.accept()
        print "accept",address
        conn.setblocking(0)
        hostlist.append(conn)
    
    def Recv(sock):
    
        data,addr = sock.recvfrom(255)
        print "recv",data
    
    if __name__ == "__main__":
        listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        listen_socket.bind((socket.gethostname(),4041))
        listen_socket.setblocking(0)
        listen_socket.listen(5)
        hostlist.append(listen_socket)
        while True:
            ready_socks,_,_ = select.select(hostlist, [], [])
            for sock in ready_socks:
                if sock == listen_socket:
                    Accept(sock)
                else:
                    Recv(sock)
    

    您可能需要为非阻塞套接字添加一些异常处理eWoldBlock错误条件