Привет, у меня есть упражнение по сборке с использованием сокетов select и msvcrt, сервера и клиентов из mltiplie chat (сервер и клиенты должны быть неблокирующими), что каждый клиент отправит сообщение, а сервер отправит сообщение все клиенты, кроме того, кто его отправил, сервер:
import socket
import select
IP = "192.168.1.154"
port = 123
default_buffer_size = 1024
open_client_sockets = []
messages_to_send = []
def send_waiting_messages(wlist):
for message in messages_to_send:
(client_sock, data) = message
if client_sock in wlist:
for sock in open_client_sockets:
if sock is not client_sock:
sock.send(data)
messages_to_send.remove(message)
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((IP, port))
sock.listen(5)
print("The server is on and waiting for client...")
while True:
rlist, wlist, xlist = select.select([sock] + open_client_sockets, open_client_sockets, [])
for current_socket in rlist:
if current_socket is sock:
(new_socket, addr) = sock.accept()
open_client_sockets.append(new_socket)
else:
data = current_socket.recv(default_buffer_size)
if data == "":
open_client_sockets.remove(current_socket)
print("Connection with client closed")
else:
messages_to_send.append((current_socket, 'Hello ' + data))
send_waiting_messages(wlist)
if __name__ == '__main__':
main()
Сборка сервера не была трудной, потому что он руководствовался (если бы я не руководствовался, я бы никогда не получил этот код работающим) книгой, но у меня проблема со сборкой клиента, и главная причина в том, что я не понимаю, как работает select.select
, не смог найти ответ, который достаточно упростит этот модуль для меня.
вот что я сделал с клиентом:
import socket
import select
import msvcrt
IP = "192.168.1.154"
port = 123
sockets = []
def write():
pass
def main():
sock = socket.socket()
sock.connect((IP, port))
while True:
rlist, wlist, xlist = select.select(sockets, sockets, [])
for current_socket in rlist:
if current_socket is sock:
data = current_socket.recv(1024)
print(data)
else:
sockets.append(current_socket)
write()
if __name__ == '__main__':
main()
Это, вероятно, показывает, что я плохо понимаю выбор модуля и упражнение на самом деле. Я видел некоторые темы с похожим вопросом, но я ничего не понимаю из них, поэтому мне действительно нужно хорошее объяснение.
В заключение я действительно потерян ...