Почему этот чат Python3 не работает после нескольких сообщений? - PullRequest
0 голосов
/ 17 января 2019

Вот что происходит: после того, как клиент отправляет некоторые сообщения, он выдает ConnectionAbortedError: [WinError 10053] и сервер продолжает работать

Изображения:

сокет сервера: enter image description here

сокет клиента: enter image description here

Вот мой код сервера:

from socket import *

def server(address, port):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.bind((address, port))
    sock.listen(10)
    while True:
        clientsock, addr = sock.accept()
        ip, _ = addr
        msg = input('YOU: ')
        clientsock.send(bytes(msg, 'utf-8'))
        data = clientsock.recv(2048)
        print('%s - ' % ip, data.decode('utf-8'))
        if not data:
            break
        clientsock.shutdown(SHUT_WR)
        clientsock.close()
    sock.close()

if __name__ == '__main__':
    server('192.168.0.101', 5000)

Клиент:

from socket import *

def client(address, port):
    sock = socket(AF_INET, SOCK_STREAM)
    sock.connect((address, port)) #0.0.0.0 isnt valid
    while True:
        data = sock.recv(2048)
        print('%s - ' % address, data.decode('utf-8'))
        msg = input('YOU: ')
        sock.send(bytes(msg, 'utf-8'))
    sock.close()

if __name__ == '__main__':
    client('192.168.0.101', 5000)

1 Ответ

0 голосов
/ 17 января 2019

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

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

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

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

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().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...