func (this *WorldServer) DoHeartBeat(session *libnet.Session) { //发送心跳响应信息 heartMsg := msgcmd.NewCmd(msgcmd.MCMD_W2M_HEARTBEAT) if err := session.Send(heartMsg); err != nil { println("World Server Error: 响应 MsgServer 心跳信息 失败. ") logFile.Printf("World Server Error: 响应 MsgServer 心跳信息 失败. ") return } }
func (this *WorldServer) HandleKeyClient(session *libnet.Session) { defer waitgroup.Done() defer session.Close() //Msg Server 连接 WS 的 Key Server 后,WS 发送 RC4 秘钥给 Msg Server cmd := msgcmd.NewCmd(msgcmd.MCMD_RESPONSERC4KEY) cmd.AddArg(this.cfg.Rc4Key) if err := session.Send(cmd); err != nil { println("World Server Error: 发送 RC4 Key 失败. ", err.Error()) logFile.Printf("World Server Error: 发送 RC4 Key 失败. ", err.Error()) return } }
func (this *MsgServer) HandleKeyClient(session *libnet.Session) { defer waitgroup.Done() defer session.Close() //Client 连接 Msg Key Server 后, 发送 RC4 秘钥给 Client cmd := msgcmd.NewCmd(msgcmd.MCMD_RESPONSERC4KEY) cmd.AddArg(this.customCodec.GetKey()) if err := session.Send(cmd); err != nil { println("Msg Key Server Error: 发送 RC4 Key 失败. ", err.Error()) logFile.Printf("Msg Key Server Error: 发送 RC4 Key 失败. ", err.Error()) return } }
func (this *WorldServer) DoRequestOnlineUsers(msg *msgcmd.Cmd, session *libnet.Session) { resMsg := msgcmd.NewCmd(msgcmd.MCMD_W2M_RESPONSE_ONLINEUSERS) resMsg.AddArg(msg.Args[0]) //发起这个请求的用户的用户名 userlist := usermap.CopyData() for _, value := range userlist { if user, ok := value.(*common.UserInfo); ok { if user.State == 1 { resMsg.AddArg(user.Name) } } } if err := session.Send(resMsg); err != nil { println("World Server Error: 发送 在线用户列表信息 失败. ") logFile.Printf("World Server Error: 发送 在线用户列表信息 失败. ") } }
func (this *Gateway) HandleClient(session *libnet.Session, index uint) { defer waitgroup.Done() defer session.Close() var serverAddr string = this.cfg.MsgServerList[index] var keyAddr string = getKeyServerAddr(serverAddr) //主动应答 MS Server Addr 和 Key Server Addr 给 Client cmd := msgcmd.NewCmd(msgcmd.MCMD_G2C_RESPONSEMSADDR) cmd.AddArg(serverAddr) cmd.AddArg(keyAddr) if err := session.Send(cmd); err != nil { println("GateWay Error: 发送Msg Server 地址信息失败. ", err.Error()) logFile.Printf("GateWay Error: 发送Msg Server 地址信息失败. %s", err.Error()) return } }
func (this *WorldServer) DoRegister(msg *msgcmd.Cmd, session *libnet.Session) { resmsg := msgcmd.NewCmd(msgcmd.MCMD_W2M_REGISTER) resmsg.AddArg(msg.Args[2]) //在返回的消息中,附上传入的临时用户名 //查找是否已经存在该用户名 row := this.database.QueryData(`SELECT * FROM users WHERE name=?`, msg.Args[0]) var userinfo *common.UserInfo = common.NewUserInfo(session) if err := row.Scan(&userinfo.ID, &userinfo.Name, &userinfo.Pwd, &userinfo.RegDate); err == sql.ErrNoRows { //可注册该用户名 userinfo.RegDate = time.Now() err = this.database.InsertData(`INSERT users (name,pwd,regdate) values (?,?,?)`, msg.Args[0], msg.Args[1], userinfo.RegDate) if err != nil { //插入数据失败,返回提示信息 println("World Server Error: 写入注册信息 失败. ", err.Error()) logFile.Printf("World Server Error: 写入注册信息 失败. ", err.Error()) resmsg.AddArg("0") resmsg.AddArg("注册用户时发生异常,请稍后再试。") if err = session.Send(resmsg); err != nil { println("World Server Error: 发送注册回馈信息 失败. ", err.Error()) logFile.Printf("World Server Error: 发送注册回馈信息 失败. ", err.Error()) return } } else { resmsg.AddArg("1") resmsg.AddArg("注册用户成功,试试登陆吧。") if err = session.Send(resmsg); err != nil { println("World Server Error: 发送注册回馈信息 失败. ", err.Error()) logFile.Printf("World Server Error: 发送注册回馈信息 失败. ", err.Error()) return } } } else { //不可注册该用户名 resmsg.AddArg("0") resmsg.AddArg("该用户名已被抢先1秒注册,换个试试吧。") if err = session.Send(resmsg); err != nil { println("World Server Error: 发送注册回馈信息 失败. ", err.Error()) logFile.Printf("World Server Error: 发送注册回馈信息 失败. ", err.Error()) return } } }
func (this *WorldServer) DoLogin(msg *msgcmd.Cmd, session *libnet.Session) { resmsg := msgcmd.NewCmd(msgcmd.MCMD_W2M_LOGIN) resmsg.AddArg(msg.Args[2]) var userinfo *common.UserInfo var isInUserMap = false var result bool if user, ok := usermap.Find(msg.Args[0]); ok { if userinfo, result = user.(*common.UserInfo); !result { println("World Server Error: (*common.UserInfo) 类型断言 失败. ") logFile.Printf("World Server Error: (*common.UserInfo) 类型断言 失败. ") return } isInUserMap = true } else { //查找是否已经存在该用户名 row := this.database.QueryData(`SELECT * FROM users WHERE name=?`, msg.Args[0]) userinfo = common.NewUserInfo(session) if err := row.Scan(&userinfo.ID, &userinfo.Name, &userinfo.Pwd, &userinfo.RegDate); err == sql.ErrNoRows { //登陆失败,没有该用户信息 resmsg.AddArg("0") if err = session.Send(resmsg); err != nil { println("World Server Error: 发送登陆回馈信息 失败. ", err.Error()) logFile.Printf("World Server Error: 发送登陆回馈信息 失败. ", err.Error()) return } } } //找到该用户数据,开始验证密码信息 if userinfo.Name == msg.Args[0] && userinfo.Pwd == msg.Args[1] { //登陆成功 resmsg.AddArg("1") resmsg.AddArg(userinfo.GetIDbyString()) resmsg.AddArg(userinfo.Name) if err := session.Send(resmsg); err != nil { println("World Server Error: 发送登陆回馈信息 失败. ", err.Error()) logFile.Printf("World Server Error: 发送登陆回馈信息 失败. ", err.Error()) return } userinfo.State = 1 } else { //登陆失败 resmsg.AddArg("0") if err := session.Send(resmsg); err != nil { println("World Server Error: 发送登陆回馈信息 失败. ", err.Error()) logFile.Printf("World Server Error: 发送登陆回馈信息 失败. ", err.Error()) return } userinfo.State = 0 } if userinfo.State == 1 { //有用户上线,广播所有用户 bcMsg := msgcmd.NewCmd(msgcmd.MCMD_W2M_BROADCAST) bcMsg.AddArg(msgcmd.IntToString(msgcmd.ECMD_BROADCAST_USERLOGIN)) bcMsg.AddArg(userinfo.Name) this.Broadcast(bcMsg) } //保存当前用户所在的MS会话地址 userinfo.Session = session //添加到usermap中 if !isInUserMap { usermap.Insert(userinfo.Name, userinfo) } }