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