2016-11-19 37 views
0

該程序應該執行的所有操作都是同時接受來自兩個客戶端的輸入並將其打印出來,而是接受來自第一個客戶端的一個輸入連接,然後開始接受輸入無限的來自第二個客戶,但不是從第一個開始。有關如何修復此代碼的任何提示? (如下所示)使用select.select的Python多路複用服務器不會同時接受客戶端

import socket 
import select 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("127.0.0.1", 4000)) 
s.listen(5) 
sockets = [] 
sockets.append(s) 
while True: 
    (read, write, err) = select.select(sockets, [], []) 
    for socket in read: 
     if (socket == s): 
      (c, a) = socket.accept() 
      sockets.append(c) 
      print ("Received connection from: ", a) 
    message = c.recv(80).decode() 
    print (message + " from " + str(a[1])) 

回答

1

只有當數據可用於防止阻塞時,您才需要從客戶端接收數據。

message = c.recv(80).decode() 

以上行無格式地讀取;它只會從最後接受的客戶端讀取。

這裏是for循環的修改版本:

for peer in read: 
    if peer == s: 
     (c, a) = peer.accept() 
     sockets.append(c) 
     print("Received connection from:", a) 
    else: 
     # Receive data from client only if data is available 
     message = peer.recv(80).decode() 
     if message: 
      print(message, "from", peer.getpeername()) 
     else: 
      # No message to read => clinet disconnection 
      print(peer.getpeername(), "disconnected") 
      sockets.remove(peer) 

我改名socketpeer防止名字的陰影;使用socket作爲變量名會影響socket模塊參考。

相關問題