本文整理汇总了Golang中libnet.Session类的典型用法代码示例。如果您正苦于以下问题:Golang Session类的具体用法?Golang Session怎么用?Golang Session使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Session类的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: HandleClient
func (this *WorldServer) HandleClient(session *libnet.Session) {
defer waitgroup.Done()
defer session.Close()
for {
msg := new(msgcmd.Cmd)
err := session.Receive(msg)
if err != nil {
println("World Server Error: 接收数据 失败. ", err.Error())
logFile.Printf("World Server Error: 接收数据 失败. ", err.Error())
break
}
if msg == nil {
continue
}
switch msg.Mid {
case msgcmd.MCMD_M2W_REGISTER:
this.DoRegister(msg, session)
case msgcmd.MCMD_M2W_LOGIN:
this.DoLogin(msg, session)
case msgcmd.MCMD_M2W_USEROFFLINE:
this.DoUserOffline(msg, session)
case msgcmd.MCMD_M2W_HEARTBEAT:
this.DoHeartBeat(session)
case msgcmd.MCMD_M2W_REQUEST_ONLINEUSERS:
this.DoRequestOnlineUsers(msg, session)
}
}
}
示例2: DoHeartBeat
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
}
}
示例3: HandleKeyClient
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
}
}
示例4: HandleKeyClient
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
}
}
示例5: DoRequestOnlineUsers
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: 发送 在线用户列表信息 失败. ")
}
}
示例6: HandleClient
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
}
}
示例7: DoRegister
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
}
}
}
示例8: DoLogin
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)
}
}
示例9: HandleClient
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程退出")
}