Почему этот чат Python3 терпит неудачу после нескольких сообщений?

Безопаснее всегда кодировать все символы, кроме тех, которые определены как «безоговорочно» в RFC-3986.

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

Итак, процентное кодирование символа плюса и других специальных символов.

Проблема, которую вы испытываете с плюсами, заключается в том, что, согласно RFC- 1866 (спецификация HTML 2.0), пункт 8.2.1. подпункт 1. «Имена и значения полей формы сбрасываются: символы пробела заменяются на« + », а затем зарезервированные символы экранируются»). Этот способ кодирования данных формы также приведен в более поздних спецификациях HTML, ищите соответствующие абзацы о приложении / x-www-form-urlencoded.

0
задан nelson450 17 January 2019 в 13:33
поделиться

1 ответ

Сервер в каждом цикле принимает нового клиента, отправляет одно сообщение, получает одно сообщение и отключает клиента. Затем он ждет другого клиента.

Вам нужен еще один цикл для обработки клиента.

Что еще один цикл может быть помещен в другой поток.

Если вы вложите этот цикл в этот цикл, вы сможете одновременно обрабатывать только одного клиента. Я изменил ваш сервер так:

def server(address, port):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind((address, port))
    sock.listen(10)
    while True: # server loop
        clientsock, addr = sock.accept()
        ip, _ = addr
        msg = "Hello to client from %s" % ip
        # next line is here because your client need message from server to send message
        clientsock.send(bytes(msg, 'utf-8'))  
        while True: #  client loop
            data = clientsock.recv(2048)
            msg = '%s - %s' % (ip, data.decode('utf-8'))
            print(msg)
            if not data:
                break
            clientsock.send(bytes(msg, 'utf-8'))  # for multiple clients you need send msg to all
        clientsock.shutdown(SHUT_WR)
        clientsock.close()
    sock.close()

Для обработки нескольких клиентов вы не хотите блокировать цикл сервера, пока цикл клиента не закончится. Вы можете запустить клиентский цикл в другом потоке и продолжить ожидание следующего клиента clientsock, addr = sock.accept().

Точно так же вы можете отделить получение сообщений от сервера и ожидание клиентского ввода.

0
ответ дан Frane 17 January 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: