2016-11-19 4 views
0

Вся эта программа должна выполнять входные данные от 2 клиентов одновременно и распечатывать их, но вместо этого он принимает 1 вход от первого клиента для подключения, затем начинает принимать входные данные бесконечно от второго клиента, но не от первого. Любые советы о том, как исправить этот код? (см. ниже)Python Мультиплексированный сервер, использующий select.select, не будет принимать клиентов одновременно

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) 

socket я переименовал в peer, чтобы предотвратить имя затенения; Использование socket в качестве имени переменной будет теневым socket ссылка на модуль.

Смежные вопросы