找回密码
 中文实名注册
搜索
查看: 241|回复: 0

聊天房

[复制链接]

8

主题

1

回帖

15

积分

新手上路

积分
15
发表于 2025-7-25 16:18:18 | 显示全部楼层 |阅读模式
[Python] 纯文本查看 复制代码
import socket
import threading

# 服务器配置
HOST = '0.0.0.0'  # 允许所有网络接口连接
PORT = 12345       # 端口号

# 存储所有连接的客户端
clients = []
nicknames = []

def broadcast(message, client_socket):
    """向所有连接的客户端广播消息,除了发送者"""
    for client in clients:
        if client != client_socket:
            try:
                client.send(message)
            except:
                # 如果发送失败,移除该客户端
                remove_client(client)

def remove_client(client_socket):
    """移除客户端连接"""
    if client_socket in clients:
        index = clients.index(client_socket)
        clients.remove(client_socket)
        nickname = nicknames[index]
        nicknames.remove(nickname)
        broadcast(f'{nickname} 离开了聊天室!'.encode('utf-8'), client_socket)

def handle_client(client_socket):
    """处理单个客户端连接"""
    # 接收客户端的昵称
    nickname = client_socket.recv(1024).decode('utf-8')
    nicknames.append(nickname)
    clients.append(client_socket)
    
    print(f'新连接: {nickname}')
    broadcast(f'{nickname} 加入了聊天室!'.encode('utf-8'), client_socket)
    
    # 持续接收客户端消息
    while True:
        try:
            message = client_socket.recv(4096)  # 4096字节缓冲区,支持较长消息
            if message:
                broadcast(message, client_socket)
            else:
                remove_client(client_socket)
                break
        except:
            remove_client(client_socket)
            break

def start_server():
    """启动服务器"""
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((HOST, PORT))
    server_socket.listen()
    print(f'服务器已启动,监听 {HOST}:{PORT}...')
    
    try:
        while True:
            client_socket, client_address = server_socket.accept()
            print(f'接受来自 {str(client_address)} 的连接')
            
            # 启动新线程处理客户端
            client_thread = threading.Thread(target=handle_client, args=(client_socket,))
            client_thread.start()
    except KeyboardInterrupt:
        print("\n服务器正在关闭...")
        server_socket.close()

if __name__ == "__main__":
    start_server()
    

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

快速回复 返回顶部 返回列表