python多线程技术问题。

以下代码使用multiprocessing.connection的Listener与Client对象,模拟客服机器人聊天。请将服务端代码改为多线程技术,实现机器人客服能够与多个客户端进程聊天。

server.py

模拟人机聊天

from multiprocessing.connection import Listener

服务器地址端口

host = ('127.0.0.1', 65539)

try:

# 启动服务器

ls = Listener(host, authkey=b'dongfang')

print('服务器启动成功')

# 开始监听客户端连接

while True:

    conn = ls.accept()

    # 输出连接客户端信息

    print('客户端信息:', ls.last_accepted)

    while True:

        # 接收客户端发送的数据

        data = conn.recv()

        print(f'客户端:{data}')

        if data == 'nihao':

            conn.send('欢迎登录')

        elif data == 'bye':

            conn.close()

            break

        else:

            conn.send('听不懂啊,再说一次')

    print(f'客户端{ls.last_accepted}已退出')

except:

print('服务器启动失败')

client.py

from multiprocessing.connection import Client

server_host = ('127.0.0.1', 1)

try:

# 连接服务器

print('连接服务器')

c = Client(server_host, authkey=b'dongfang')

print('服务器连接成功')

while True:

    mess = input('请输入聊天信息:')

    c.send(mess)

    try:

        # 等待接收数据

        data = c.recv()

        print(f'服务器:{data}')

    except:

        break

c.close()

except:

print('服务器异常,连接失败')

程序中的端口号应该小于65536,65539是无效的端口号。
以下为多线程版本,每当有新的客户端连接时,都会创建一个新的线程来处理该客户端请求。这样就可以同时处理多个客户端的请求了。

from multiprocessing.connection import Listener
import threading

# 服务器地址端口
host = ('127.0.0.1', 65535)

# 处理客户端请求的函数
def handle_client(conn, client_address):
    # 输出连接客户端信息
    print('客户端信息:', client_address)

    while True:
        # 接收客户端发送的数据
        data = conn.recv()
        print(f'客户端:{data}')

        if data == 'hello':
            conn.send('欢迎登录')

        elif data == 'bye':
            conn.close()
            break

        else:
            conn.send('听不懂啊,再说一次')

    print(f'客户端{client_address}已退出')

try:
    # 启动服务器
    ls = Listener(host, authkey=b'dongfang')
    print('服务器启动成功')

    # 开始监听客户端连接
    while True:
        conn = ls.accept()

        # 创建新线程处理客户端请求
        t = threading.Thread(target=handle_client, args=(conn, ls.last_accepted))
        t.start()

except Exception as e:
    print('服务器启动失败:', e)