【问题标题】:Python 2.7: Listen to requested connections + listen to already established connections at the same timePython 2.7:监听请求的连接 + 同时监听已经建立的连接
【发布时间】:2024-04-17 09:40:02
【问题描述】:

我目前正在尝试制作聊天室服务器。我正在努力做到这一点,以便我可以侦听新请求的连接并同时侦听从已建立的连接发送的消息。

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

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.'

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

【问题讨论】:

    标签: python python-2.7 networking server


    【解决方案1】:

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

    1. 一种简单的方法是一次接受一个连接,并通过将套接字设置为异步非阻塞,在接受的套接字上接收固定数量的连接。

    以下是执行此操作的示例代码。

    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)
    

    【讨论】:

    • 您可能需要添加一些异常处理 EWOULDBLOCK ERROR 条件或非阻塞套接字
    最近更新 更多