机房局域网聊天服务器(Python)1.0

import threading
import time
SERVER_HOST = '10.177.32.60'

#这里以这个ip为例,就是以10.177.32.60的这台电脑作为服务器
SERVER_PORT = 19198

#样例端口号:19198


ADMIN_IP = '10.177.32.60'

# 存储连接的客户端
clients = []
# 用于存储客户端的最后消息时间,防止刷屏
last_message_time = {}

# 处理客户端连接
def handle_client(client_socket, client_address):
    print(f"New connection: {client_address}")

    # 向所有客户端广播消息
    def broadcast(message):
        for client in clients:
            try:
                client.send(message.encode())
            except:
                clients.remove(client)

    # 处理管理员命令
    def handle_admin_command(message, client_address):
        if client_address[0] != ADMIN_IP:
            client_socket.send("You are not authorized to execute this command.".encode())
            return

        if message.startswith('/kick'):
            parts = message.split()
            if len(parts) == 2:
                client_ip_to_kick = parts[1]
                # 查找并断开指定IP的客户端
                for client in clients:
                    client_address = client.getpeername()
                    if client_address[0] == client_ip_to_kick:
                        client.send("You have been kicked by the admin.".encode())
                        client.close()
                        clients.remove(client)
                        print(f"Kicked client {client_ip_to_kick}")
                        break
            else:
                client_socket.send("Invalid command format. Use /kick .".encode())

    # 接收并转发消息
    while True:
        try:
            message = client_socket.recv(1024).decode()
            if not message:
                break

            # 如果是管理员命令,处理特殊命令
            if message.startswith('/'):
                handle_admin_command(message, client_address)
                continue

            # 防止刷屏:限制每个客户端的消息发送频率(例如,每5秒只能发送一条消息)
            current_time = time.time()
            if client_address not in last_message_time or (current_time - last_message_time[client_address]) >= 5:
                broadcast(f"{client_address[0]}: {message}")
                last_message_time[client_address] = current_time
            else:
                # 如果在短时间内发送了消息,给出提示
                client_socket.send("You are sending messages too quickly. Please wait a moment.".encode())

        except:
            break

    # 断开连接
    clients.remove(client_socket)
    client_socket.close()

# 启动服务器
def start_server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((SERVER_HOST, SERVER_PORT))
    server_socket.listen(5)
    print("Server is running on", SERVER_HOST, SERVER_PORT)

    while True:
        client_socket, client_address = server_socket.accept()
        clients.append(client_socket)
        # 启动一个新线程来处理每个客户端的连接
        threading.Thread(target=handle_client, args=(client_socket, client_address)).start()

# 启动服务器
start_server()

你可能感兴趣的:(python,网络)