首页 > 解决方案 > 为什么这个 Python3 聊天在几条消息后失败?

问题描述

这就是发生的事情:客户端发送一些消息后,它给出 ConnectionAbortedError: [WinError 10053] 并且服务器继续运行

图片:

服务器套接字: 在此处输入图像描述

客户端套接字: 在此处输入图像描述

这是我的服务器代码:

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)

标签: python-3.xchat

解决方案


每个循环中的服务器接受新客户端发送一条消息接收一条消息并断开客户端。然后它等待另一个客户。

您需要另一个循环来处理客户端。

另一个循环可以放在另一个线程中。

如果您将该循环嵌套在此循环中,则您一次只能处理一个客户端。我这样修改了您的服务器:

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

同样,您可能希望将接收消息与服务器分开并等待客户端输入。


推荐阅读