3.User - EVA-JianJun/ChatRoom-V3 GitHub Wiki

创建 User

from ChatRoom import User

user_foo = User(
        user_name="Foo",
)

创建 User 会在当前文件夹新建 User 用户名的如 .Foo 文件夹.

User 参数文档

User 的配置会稍微复杂点,毕竟 User 需要告诉 Room 自身的一些信息,而这些信息需要开发者按需提供.

"""
文档:
    创建一个聊天室用户

参数:
    user_name : str
        用户名
    user_password : str (Default: "")
        用户密码
    room_ip : str (Default: "127.0.0.1")
        需要连接的聊天室ip, 默认为本机ip
    room_port : int  (Default: 2428)
        需要连接的聊天室端口
    room_password : str (Default: "Passable")
        需要连接的聊天室密码
    local_ip : str (Default: "")
        本机局域网ip,不填写系统自动获取,优先获取优先级高的网卡本地ip
    public_ip : str (Default: "")
        如果本机拥有公网ip填写public_ip后本机被标记为公网ip用户
        除了内网互联其他用户连接本用户都将通过此公网ip进行连接
    server_port : int (Default: ramdom)
        本机消息服务对外端口, 默认为 0 系统自动分配
        请注意需要在各种安全组或防火墙开启此端口
    lan_id : str (Default: "Default")
        默认为"Default", 局域网id, 由用户手动设置
        同一局域网的用户请设定相同的局域网id, 这样同一内网下的用户将直接局域网互相连接
    log : None or str (Default: "INFO")
        日志等级
            None: 除了错误什么都不显示
            "INFO": 显示基本连接信息
            "DEBUG": 显示所有信息
    password_digits : int (Default: 16)
        密码位数, 默认16位
    encryption : bool (default True)
        是否加密传输, 不加密效率较高
    white_list : str (Default: [])
        用户白名单 : 如果设置白名单,只有白名单内的用户可以连接
    black_list : str (Default: [])
        用户黑名单 : 如果设置黑名单,黑名单内的用户不可连接
    safe_path_list : list (default [".user_name/DEFAULT_SAFE_PATH"])
        安全文件夹, 文件操作只能在这个列表中的文件中操作
    log_config_file : str (Default: ".user_name/LOG_CONFIG.py")
        日志配置文件路径 : 配置当前user的日志id信息
    group_list : list (Default: ["DEFAULT_GROUP"])
        组(群)列表, 只有在同一个组的用户会互相连接
    status_share_user_list : list (Default: None)
        状态分享用户列表, 不设置不会共享任何用户, 设置了只分享列表中的用户
        设置为 status_share_user_list="ALL" 则分享给所有用户
    share_object_user_info_dict : dict (Default: None)
        变量共享用户信息字典, 不设置不对变量共享做限制
        设置为 share_object_user_info_dict={"name": ["Foo"]} 则 name 变量只会共享给 Foo 用户
    ip_whitelist  : list (default [])
        ip白名单, 在这个白名单内的ip会忽略拉黑, 只有白名单IP可以连接
    forced_encryption : bool (default False)
        是否强制加密, 设置为 True 后对方必须开启加密才能连接
    data_version_record : int (>0 default 3)
        本地数据存储, 历史数据版本保留数量
    mail_info_list : list[dict]
        SMTP 用户信息列表, 包含 账户, 密码, SMTP服务器地址, SMTP端口
        mail_info_list = [
            {
                "user" : "[email protected]",
                "password" : "AAAAAAAAAAAA",
                "host" : "xxx.mail.com",
                "port" : 465,
            }
        ]
    mail_to_list : list
        默认收件人邮箱地址列表, eg: ["[email protected]", "[email protected]"]
    protocol : str (default "pickle")
        序列化协议, 可选: "json", "pickle", "cloudpickle", "dill"
    check_repeat : bool (default False)
        是否检测重复连接, True: 不允许重复连接 False: 新连接的会覆盖旧连接(验证后)
    enable_gpu_monitor : bool (default False)
        是否启动 GPU 监控, 监控 GPU 状态, 默认不启动
    room_connection_error_retries : int (default 5)
        连接 Room 失败时重试连接次数
    timeout : int (default 600)
        当和其他用户通讯时, 如果其他用户断线等待的时间(秒)
"""

user_name

用户名, 必要参数, 命名要符合变量命名规则, 推荐使用全英文加数字后缀.

user_name = "Foo"

user_password

用户密码, 不填默认随机

user_password = "abc123"

room_ip

room 服务ip, 默认本机本地ip, 多网卡下可能和预期不同, 需要手动填写指定.

room_ip = "192.168.xxx.xxx"

room_port

room 服务端口, 默认2428.

room_port = 2428

room_password

room 密码, 默认 "Passable".

room_password = "Passable"

local_ip

本机局域网ip,不填写系统自动获取,优先获取优先级高的网卡本地ip.

local_ip = "192.168.xxx.xxx"

public_ip

公网ip, 默认为空, 表示不拥有公网ip.

public_ip = "xxx.xxx.xxx.xxx"

如果本机拥有公网ip填写public_ip后本机被标记为公网ip用户, 除了内网互联其他用户连接本用户都将通过此公网ip进行连接

server_port

User 服务端口, 默认系统随机分配.

server_port = 10000

请注意需要在各种安全组或防火墙开启此端口

lan_id

局域网id, 需要手动设置, 默认都一样为 "Default".

lan_id = "NET_A"

同一局域网的用户请设定相同的局域网id, 这样同一内网下的用户将直接局域网互相连接

log

日志等级, 默认 "INFO":

  • None: 除了错误什么都不显示

  • "INFO": 显示基本连接信息

  • "DEBUG": 显示所有信息

    log = "INFO"

password_digits

密码位数, 默认16位.

password_digits = 16

encryption

是否加密传输, 默认开启加密, 不开启加密略微提升传输效率, 主要是 AES 加密的损耗

encryption = True

white_list

用户名称白名单列表, 默认为空, 只有白名单内的用户可以连接.

white_list = ["Bar", "Too"]

black_list

用户名称黑名单列表, 默认为空, 黑名单内的用户不可连接.

black_list = ["Too"]

safe_path_list

安全文件目录列表, 文件传输功能若设置了该变量, 那么所有允许传输的文件必须在该文件目录下, 如果传输了非法的文件, 会报一个警告异常!

safe_path_list = ["G:/abc/"]

log_config_file

日志配置文件路径, 默认为用户目录下的 .User/LOG_CONFIG.py

log_config_file = "G:/abc/MY_LOG_CONFIG.py"

group_list

组(群)列表, 只有在同一个组的用户会互相连接, 默认为 ["DEFAULT_GROUP"]

这个参数可以用来控制服务端的可见性, 比如服务端随机设置了一个密码字符串 "$fAd32Sd*das^&" 作为自己的组ID, 只有知道这个密码的其他客户端用户设置了自己的 group_list 才能连接服务端.

status_share_user_list

状态分享用户列表, 不设置不会共享任何用户, 设置了只分享列表中的用户

# 所有用户都会收到本机共享的状态信息
status_share_user_list="ALL"

# 只有 Foo 和 Bar 用户可以收到本机共享的状态信息
status_share_user_list=["Foo", "Bar"]

share_object_user_info_dict

变量共享用户信息字典, 不设置不对变量共享做限制

# name 变量只会共享给 Foo 用户, 未设置的变量不做限制
share_object_user_info_dict={"name": ["Foo"]}

ip_whitelist

ip白名单, 在这个白名单内的ip会忽略拉黑.

ip_whitelist = ["192.168.0.100"]

forced_encryption

是否强制加密, 设置为 True 后对方必须开启加密才能连接

forced_encryption = True

data_version_record

本地数据存储, 历史数据版本保留数量, 就是 celldict 包中的 version_record 参数

data_version_record = 3

mail_info_list

SMTP 邮件服务账户信息等, 按照格式构造, 如果有多个账户信息, 那么发送邮件的时候会随机选择一个用于邮件发送, 注意发送邮件不要调用过于频繁, 会被 SMTP 服务器异常处理.

mail_info_list = [
    {
        "user" : "[email protected]",
        "password" : "AAAAAAAAAAAA",
        "host" : "xxx.mail.com",
        "port" : 465,
    }
]

mail_to_list

收件人地址列表

mail_to_list = ["[email protected]", "[email protected]"]

protocol

底层序列化协议, User 默认为 pickle 协议.

protocol = "pickle"

check_repeat

是否检测重复登录, 默认 False 不检测, 验证 User 身份后, 后连接的同名 User 会顶替旧的 User, 设置为 True 后不允许重复登录.

check_repeat = False

该功能是为了解决双端连接用户信息不匹配, 造成一端尝试重连导致用户重复而重连失败. (Linux 和 Windows 连接可能出现).

警告: 但是默认情况下, 如果用户同时启动了两个同名, 且信息正确的用户, 那么这两个用户会互相竞争连接, 最后的结果是触发 Room 的流控限制, 有一端或者双端都出现了连接失败, 所以必须要注意不能出现两个同名用户进行连接.

enable_gpu_monitor

是否启动 GPU 监控, 监控 GPU 状态, 默认不启动, 启用会在自身状态中增加 GPU 信息并在 Room Gui 中显示.

enable_gpu_monitor = True

启用该功能会在系统中启动一个服务, 该服务在程序正常结束后自动删除

默认不启用是因为该功能可能引发程序奔溃, 需要按需测试!

room_connection_error_retries

连接 Room 失败时重试连接次数

room_connection_error_retries = 5

注意

需要注意的有 public_ipserver_portlan_id 三个参数

  • 具有公网IP的机器才需要设置 public_ip
  • 有些机器的环境有安全组或防火墙什么的,需要放通相应的端口,所以此类机器需要指定 server_port
  • 在同一局域网内的用户指定为相同的 lan_id ,好让他们互相使用局域网直接互相连接

新建 User 会默认新建 LOG_CONFIG.py 日志文件.

RunController 运行控制器

def fun1():
    print("fun1 run!")
def fun2():
    print("fun2 run!")

user.run_controller.add_function("fun1", fun1)
user.run_controller.add_function("fun2", fun2)

user.run_controller.run() # 会阻塞运行

运行 RunController 控制器后可以方便的使用命令运行提前设置的函数等, 这个功能一般用在服务端.

λ:h
2025-03-10 11:08:48 |       RunController       | 📋 当前保存的函数列表:
1                   : fun1
2                   : fun2
2025-03-10 11:08:48 |       RunController       | help(h) 显示帮助, clc 清屏, exit 退出!
λ:1
fun1 run!
λ:2
fun2 run!