Сервер Python Multiplexed, использующий select.select, не будет принимать клиентов одновременно

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

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 ссылка на модуль.

Другие вопросы по тегам