В вашем скрипте есть несколько вещей, которые кажутся странными.
Стандартное использование модуля select таково: у вас есть один сокет для прослушивания соединений и один сокет на соединение с клиентами.
Сначала только этот сокет добавляется в ваш список потенциальных читателей, а ваш список потенциальных читателей пуст.
Вызов select.select (потенциальные читатели, потенциальные_пользователи, потенциальные_отказы) вернет 3 списка: -Сокеты, готовые к чтению - Сокеты, готовые к записи - Сокеты с ошибкой
В списке сокетов, готовых к чтению, если сокет прослушивает соединение, он должен принять его и поместить новый сокет впотенциальные чтения, потенциальные записи и потенциальные ошибки.
Если сокет другой, то есть данные для чтения из этого сокета.Вы должны позвонить в sock.recv (длина)
Если вы хотите отправить данные, вы должны отправить их из списка wlist, возвращаемого select.select.
Список ошибок используется не оченьчасто.
Теперь, для решения вашей проблемы, способа, которым вы описываете свой протокол (если я правильно понял), это может выглядеть так:
import socket, select
sock_producer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_producer.bind(('localhost', 5000))
sock_producer.listen(5)
producers = []
clients = []
sock_consumer_listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Note: different port to differentiate the clients who receive data from the one who sends messages
sock_consumer_listener.bind(('localhost', 5001))
rlist = [sock_producer, sock_listener]
wlist = []
errlist = []
out_buffer = []
while True:
r, w, err = select.select(rlist, wlist, errlist)
for sock in r:
if sock == sock_producer:
prod, addr = sock.accept()
producers.append(prod)
rlist.append(prod)
elif sock == sock_consumer_listener:
cons, addr = sock.accept()
clients.append(cons)
wlist.append(cons)
else:
out_buffer.append(sock.recv(1024))
out_string = ''.join(out_buffer)
out_buffer = []
for sock in w:
if sock in clients:
sock.send(out_string)
У меня естьне тестировал этот код, поэтому может быть несколько ошибок, но это близко к тому, как я это сделаю.