Exemplo n.º 1
0
func (this *Client) HandleReqOnlineUsers(msg *msgcmd.Cmd) {
	for i, value := range msg.GetArgs() {
		if value != this.user.Name {
			this.AddtoOnlineUserMap(value)
		}
	}
}
Exemplo n.º 2
0
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())
	}
}
Exemplo n.º 3
0
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
	}
}
Exemplo n.º 4
0
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])
	}
}
Exemplo n.º 5
0
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("类型断言失败!")
		}
	}
}
Exemplo n.º 6
0
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程退出")
}