0x03. 协议 LOGIN_PASSWORD

当用户输入账户密码后,点击 “登录” 按钮,客户端发送 LOGIN_PASSWORD 协议给服务端。服务端在 LoginServerInitializer.initChannel 接受到后解析出 LoginPasswordHandler.handlePacket 回调函数。

LoginPasswordHandler.handlePacket 登录收包回调函数

sequenceDiagram
    participant 客户端
    participant 服务端
    客户端-->>服务端: 登录请求
    Note over 服务端: 解析数据包取出字段 账户, 密码, 4字节十六进制转字符串
    服务端-->>客户端: 如果多次重复尝试登录, 返回 SendOpcode.LOGIN_STATUS, value 6 
    Note over 服务端: 查询sql语句: "SELECT id, password, gender, banned, pin, pic, characterslots, tos, language FROM accounts WHERE name = 登录账户"
    服务端-->>客户端: 账户不存在, 返回 SendOpcode.LOGIN_STATUS, value 5
    Note over 服务端: 检查登录状态: "SELECT loggedin, lastlogin, birthday FROM accounts WHERE id = ?", sql.id 
    Note over 服务端: 登录检查完毕
    服务端-->>客户端: IP/MAC是否被封禁, 返回 SendOpcode.LOGIN_STATUS, value 3
    Note over 服务端: IP/MAC 白名单
    服务端-->>客户端: 密码校验失败, 返回 SendOpcode.LOGIN_STATUS, value 4
    Note over 服务端: 密码校验成功
    服务端-->>客户端: 登录成功, 需要弹出同意告知书, 返回 SendOpcode.LOGIN_STATUS, value 23
    Note over 服务端: 检查当在线状态中,是否又当前登录账户的客户端ID
    Note over 服务端: 在线信息中存在客户端ID,则断开在线请求,将客户端ID绑定当前 Client 信息
    Note over 服务端: 跟新SQL, sql.id 登录状态为 LOGIN_LOGGEDIN "UPDATE accounts SET loggedin = ?, lastlogin = ? WHERE id = ?")
    Note over 服务端: 更新变量和状态
    服务端-->>客户端: 登录成功, 返回 SendOpcode.LOGIN_STATUS, value 0

自动注册

当账户不存在时,并且后台配置了 automatic_register 那么会执行自动注册账户功能。

sequenceDiagram
    participant 客户端
    participant 服务端
    客户端-->>服务端: 登录请求
    Note over 服务端: 解析数据包取出字段 账户, 密码, 4字节十六进制转字符串
    服务端-->>客户端: 如果多次重复尝试登录, 返回 SendOpcode.LOGIN_STATUS, value 6 
    Note over 服务端: 查询sql语句: "SELECT id, password, gender, banned, pin, pic, characterslots, tos, language FROM accounts WHERE name = 登录账户"
    Note over 服务端: 账户不存在, 开始自动注册
    Note over 服务端: "INSERT INTO accounts (name, password, birthday, tempban) VALUES (登录账户, 登录密码, 默认注册时间, 默认注册时间)"
    服务端-->>客户端: 再次调用登录函数结果返回客户端

评论*

* 为必填