2016-11-19 36 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模块参考。

相关问题