Python (2.7) умножить чат используя сокеты и выбрать модуль (неблокирующий код) - PullRequest
1 голос
/ 25 марта 2019

Привет, у меня есть упражнение для сборки с использованием сокетов 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()

Это, вероятно, показывает, что я плохо понимаю выбор модуля и упражнение на самом деле.Я видел некоторые темы с похожим вопросом, но я ничего не понимаю из них, поэтому мне действительно нужно хорошее объяснение.В заключение я действительно потерян ...

1 Ответ

1 голос
/ 27 марта 2019

select нужен (в Windows) хотя бы один непустой список «ожидаемых объектов», поэтому с sockets = [] он не может работать.Установите sockets = [sock] после sock = socket.socket().

Простой, но полный пример см. В этом ответе на «Обработка нескольких запросов с помощью select» .

...