public void Handle_Login_Auth(uint serial, PKG.Login_DB.Auth a, xx.UvTcpPeer peer) { // 参数合法性初步检查 if (string.IsNullOrEmpty(a.username) || a.password == null) { peer.Send(new PKG.Generic.Error { number = -2, text = "username is null/empty or password is null." }); } // 模拟数据库异步查询 new Task(() => { // 准备回发结果 xx.IObject pkg = null; try { // 模拟一个耗时 SQL 操作 Thread.Sleep(1000); if (a.username == "abc" && a.password == "123") { pkg = new PKG.DB_Login.Auth_Success { userId = 12 }; } else { pkg = new PKG.Generic.Error { number = -3, text = "bad username or password." }; } } catch (Exception ex) { pkg = new PKG.Generic.Error { number = -4, text = ex.Message }; } // 核实回发结果是否已经填充 Debug.Assert(pkg != null); // 封送到 uv 主线程去执行 dispatcher.Dispatch(() => { // 检查连接的死活. 如果没断开就回发结果 if (peer.alive) { // 发送处理结果 peer.SendResponse(serial, pkg); } }); }).Start(); }
public void Handle_Auth(uint serial, PKG.Client_Login.Auth a, xx.UvTcpPeer peer) { // 如果还没有连上 if (!dbClient.alive) { peer.SendResponse(serial, new PKG.Generic.Error { number = -1, text = "dbClient disconnected." }); return; } // 向 db 服务发起问询 dbClient.SendRequestEx(new PKG.Login_DB.Auth { username = a.username, password = a.password }, recv => { // 如果等到 db 返回结果到达时 peer 已经断开, 则后续都不用继续做了 if (!peer.alive) return; // rpc 超时 if (recv == null) { peer.SendResponse(serial, new PKG.Generic.Error { number = -2, text = "dbClient Auth timeout." }); } else { switch (recv) { case PKG.Generic.Error o: peer.SendResponse(serial, o); break; case PKG.DB_Login.Auth_Success o: // todo: 通过 lobbyClient 继续 SendRequestEx( PKG.Login_Lobby.Enter ). 在收到 Lobby 返回的 EnterSuccess 之后 通过 peer 发送 lobby 生成的 token peer.SendResponse(serial, new PKG.Generic.Success { }); break; default: peer.SendResponse(serial, new PKG.Generic.Error { number = -3, text = "dbClient Auth Result: unhandled package " + recv.ToString() }); break; } } }); }