2016-12-05 74 views
2

我目前正在嘗試製作一個聊天室服務器。我試圖讓它可以偵聽新請求的連接,並同時偵聽已建立的連接發送的消息。Python 2.7:聽取請求的連接+同時收聽已建立的連接

我可以用它來監聽請求的連接:

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

但我怎麼做這兩個與此同時?

回答

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) 
+0

謝謝,這對我很有用! – BooHoo

+0

您可能需要添加一些異常處理EWOULDBLOCK ERROR條件gor非阻塞套接字 – cmidi