Привет, у меня есть упражнение для сборки с использованием сокетов select и msvcrt (кстати, на python 2.7), сервера и клиентов в чате mltiplie (это означает, что сервер и клиенты должны быть построены неблокирующими), что каждый клиент будет отправлять сообщениеи сервер отправит сообщение всем клиентам, кроме того, кто его отправляет, это сервер:
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()
Это, вероятно, показывает, что я плохо понимаю выбор модуля и упражнение на самом деле.Я видел некоторые темы с похожим вопросом, но я ничего не понимаю из них, поэтому мне действительно нужно хорошее объяснение.В заключение я действительно потерян ...