欢迎访问宙启技术站
智能推送

使用Python编写一个简单的在线聊天程序

发布时间:2023-12-04 08:09:17

在Python中编写一个简单的在线聊天程序可以使用Socket模块来实现网络通信。以下是一个简单的示例代码:

import socket
import threading

# 创建一个socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'  # 本机IP地址
port = 55555  # 设置端口号

# 绑定IP地址和端口号
server_socket.bind((host, port))

# 监听连接
server_socket.listen()

# 存储已连接的客户端信息
clients = []
nicknames = []


# 广播消息给所有连接的客户端
def broadcast(message):
    for client in clients:
        client.send(message)


# 处理客户端的消息
def handle(client):
    while True:
        try:
            # 接收客户端发送的消息
            message = client.recv(1024)
            # 广播消息给其他客户端
            broadcast(message)
        except:
            # 客户端断开连接
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            nicknames.remove(nickname)
            broadcast(f'{nickname}离开聊天室'.encode('utf-8'))
            break


# 接收客户端连接,并处理连接
def receive():
    while True:
        # 接收客户端的连接请求
        client, address = server_socket.accept()
        print(f"连接地址: {str(address)}")

        # 发送欢迎消息给新连接的客户端
        client.send('欢迎进入聊天室,请输入昵称:'.encode('utf-8'))

        # 存储新连接的客户端
        clients.append(client)

        # 接收客户端发送的昵称
        nickname = client.recv(1024).decode('utf-8')
        nicknames.append(nickname)

        # 广播新用户加入的消息给所有客户端
        print(f'{nickname}已连接')
        broadcast(f'{nickname}加入聊天室'.encode('utf-8'))

        # 单独处理每个客户端的消息
        client.send('连接成功'.encode('utf-8'))
        thread = threading.Thread(target=handle, args=(client,))
        thread.start()


if __name__ == "__main__":
    print("等待连接中...")
    receive()

运行程序后,在另一个终端或者电脑上使用telnet命令连接到本机IP地址和指定的端口号(例如:telnet 127.0.0.1 55555),即可进入聊天室。不同的连接在服务器端会分配一个昵称,并可以互相发送消息。

`bash

连接地址: ('127.0.0.1', 51813)

连接地址: ('127.0.0.1', 51814)

ZhangSan已连接

欢迎进入聊天室,请输入昵称:

李四已连接

welcome to chat room, please enter nickname:

Alice已连接

hello world

ZhangSan:

hello world

ZhangSan

Alice:

hi everyone!