func (this *Client) HandleReqOnlineUsers(msg *msgcmd.Cmd) { for i, value := range msg.GetArgs() { if value != this.user.Name { this.AddtoOnlineUserMap(value) } } }
func (this *MsgServer) DoRequestOnlineUsers(msg *msgcmd.Cmd, user *common.UserInfo) { //转发Client的请求给WS msg.ChangeCmdMid(msgcmd.MCMD_M2W_REQUEST_ONLINEUSERS) msg.AddArg(user.Name) if err := this.wsSession.Send(msg); err != nil { println("Msg Server Error: 转发请求在线用户列表消息 失败. ", err.Error()) logFile.Printf("Msg Server Error: 转发请求在线用户列表消息 失败. ", err.Error()) } }
func (this *MsgServer) DoLogin(msg *msgcmd.Cmd, user *common.UserInfo) { //转发登陆消息给 WS //重新封装消息 msg.ChangeCmdMid(msgcmd.MCMD_M2W_LOGIN) msg.AddArg(user.Name) //添加临时用户名 if err := this.wsSession.Send(msg); err != nil { println("Msg Server Error: 发送注册信息 失败. ", err.Error()) logFile.Printf("Msg Server Error: 发送注册信息 失败. ", err.Error()) return } }
func (this *MsgServer) HandleReqOnlineUsers(msg *msgcmd.Cmd) { //根据回馈信息的第一个参数,查找那个用户的信息 user := this.FindUser(msg.Args[0]) if user == nil { println("Msg Server Error: 查找指定用户时 失败. %s", msg.Args[0]) logFile.Printf("Msg Server Error: 查找指定用户时 失败. %s", msg.Args[0]) return } //给Client返回结果 msg.ChangeCmdMid(msgcmd.MCMD_M2C_RESPONSE_ONLINEUSERS) //通知对应的Client,结果信息 if err := user.Session.Send(msg); err != nil { println("Msg Server Error: 发送在线用户列表响应 失败. %s", msg.Args[3]) logFile.Printf("Msg Server Error: 发送在线用户列表响应 失败. %s", msg.Args[3]) } }
func (this *MsgServer) BroadCastToAllUser(msg *msgcmd.Cmd) { msg.ChangeCmdMid(msgcmd.MCMD_M2C_BROADCAST) userlist := this.userlist.CopyData() for _, value := range userlist { if user, ok := value.(*common.UserInfo); ok { if user.State == 1 { if err := user.Session.Send(msg); err != nil { println("Msg Server Error: 广播信息给所有用户 失败. ", err.Error()) logFile.Printf("Msg Server Error: 广播信息给所有用户 失败. ", err.Error()) } } else { println("有用户未在线:", user.Name) } } else { println("类型断言失败!") } } }
func (this *MsgServer) HandleClient(session *libnet.Session) { defer waitgroup.Done() //创建一个“匿名用户”,并添加到MS的用户列表中 user := common.NewUserInfo(session) user.MsgChan = make(chan *msgcmd.Cmd, 1024) //插入到用户列表中 this.userlist.Insert(user.Name, user) var isRun bool = true //开一个单独的协程,负责等待Client消息 go func() { for isRun { msg := new(msgcmd.Cmd) if session.IsClosed() { return } err := session.Receive(msg) if err != nil { if err == io.EOF { //Client 关闭了会话 msg.Mid = msgcmd.MCMD_C2M_CLIENTEXIT println("Client 关闭了会话") isRun = false } println("Msg Server Error: 接收数据 失败. ", err.Error()) logFile.Printf("Msg Server Error: 接收数据 失败. ", err.Error()) } user.MsgChan <- msg } }() FORLOOP: for { timer := time.NewTimer(this.cfg.Expire * time.Second) var msg *msgcmd.Cmd select { case msg = <-user.MsgChan: case <-timer.C: //接收客户端消息超时,客户端未做任何操作,同时没有心跳包发送过来,判定用户已经离线 msg = msgcmd.NewCmd(msgcmd.MCMD_C2M_CLIENTEXIT) println("客户端操作超时") } timer.Stop() switch msg.Mid { case msgcmd.MCMD_C2M_REGISTER: this.DoRegister(msg, user) case msgcmd.MCMD_C2M_LOGIN: this.DoLogin(msg, user) case msgcmd.MCMD_C2M_HEARTBEAT: this.DoHeartBeat(msg, user) case msgcmd.MCMD_C2M_REQUEST_ONLINEUSERS: this.DoRequestOnlineUsers(msg, user) case msgcmd.MCMD_C2M_CLIENTEXIT: this.DoClientExit(user) break FORLOOP default: if msg != nil { println("好像接收到了什么...") } } } println("用户Go程退出") }