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 (登录账户, 登录密码, 默认注册时间, 默认注册时间)"
服务端-->>客户端: 再次调用登录函数结果返回客户端