首页 > 其他分享 >跟炒鸡辣鸡一起学用go写游戏后端2

跟炒鸡辣鸡一起学用go写游戏后端2

时间:2022-11-03 10:32:38浏览次数:72  
标签:鸡辣鸡 string nil res req go json 学用 msg


上回说完了采用何种方式与前端进行交互,这次来说说使用何种形式的数据格式与前端进行交互。也就是通常所说的protocol(协议)。
目前,比较主流的是json和xml的方式,不过鉴于游戏对性能要求比较高,而是用json的网络消耗比较高,一些序列化反序列化的协议也渐渐展露头角,比如protobuf、protostuff等。今天我们暂且就以json为例来说说
在项目中,可以使用以下方式来接收前端客户端发过来的数据包

msg, ok := <-s.mq
//s表示的是session服务,代表客户端与服务端建立的连接
type Session struct {
conn *websocket.Conn
IP string
mq chan *ClientMsg
Data interface{}
LoggedIn bool
exitChan chan bool
cleanOnce sync.Once
kickOnce sync.Once
OnLogout func()
}
//这个是session服务的定义,可以看出mq就是一个channel,专门用于接收客户端发来的请求数据包
//和向客户端发出数据包

于是,接收的代码就可以这样写:

msg, ok := <-s.mq:
if !ok {
glog.Info("<-s.mq != ok")
return
}

res := dispatcher.DispatchMsg(msg, s)
if res != nil {
fmt.Printf("res != nil %s\n",res)
s.SendToClient(res)
}

而这个msg变量就是数据包,DispatchMsg方法是一个路由控制器,用于向下将数据包请求转发给下层handlers。

func (registry *MsgRegistry) DispatchMsg(msg *server.ClientMsg, sess *server.Session) []byte {
f := registry.getHandler(msg.MsgId)
if f == nil {
glog.Error("msgId: has no handler")
return nil
}
return f(msg, sess)
}

在相应的handler收到msg后,需要按照约定的数据结构对Msg进行类似于反序列化的操作,所以,就不得不提到我们事先应该给前端约定传输的数据结构了,以用户登录为例:

func LoginHandler(m *server.ClientMsg, sess *server.Session) []byte {
reqStr := m.MsgBody.(string)
req := &domainUser.MsgLoginReq{} //1
err := json.Unmarshal([]byte(reqStr), r1eq)
if err != nil {
glog.Error("LoginHandler Unmarshal err")
return nil
}

imei := req.Imei
model := req.Model
address := req.Address
jingdu := req.JingDu
weidu := req.WeiDu
version := req.Version
...
res := &domainUser.MsgLoginAck{} //2
res.BroadCast = "请大家文明游戏,禁止赌博!"
...
res.Code = 1
res.Reason = "登陆成功!"
res.UserInfo = userInfo
go UserLoginLog(userId)

return server.BuildClientMsg(m.MsgId, res)
}

在我打标记的地方可以看出来那两个就是前后端需要统一的字段部分
其中这两个数据结构的定义如下:

type MsgLoginReq struct {
Imei string `json:"imei"`
Model string `json:"Model"`
UserToken string `json:"userToken"`
Version string `json:"version"`
Channel string `json:"channel"`
Address string `json:"address"`
JingDu float64 `json:"jingdu"`
WeiDu float64 `json:"weidu"`
}
type MsgLoginAck struct {
Code int `json:"code"`
Reason string `json:"reason"`
UserInfo UserInfoDef `json:"userInfo"`
BroadCast string `json:"broadcast"`
IsReboot bool `json:"isReboot"`
}

这样定义之后,go可以自动的将json解析为可以直接用点号进行访问,也可以反转。


标签:鸡辣鸡,string,nil,res,req,go,json,学用,msg
From: https://blog.51cto.com/u_14196886/5819072

相关文章

  • go 常见外部包解析
    go(五)1、gorilla/mux导入:import"github.com/gorilla/mux"gorilla/mux是一个强大的路由,小巧但是稳定高效,不仅可以支持正则路由还可以按照Method,header,host等信息匹配使用示......
  • Django --根据已有表生成ORM模型
    在实际开发中,有些时候可能数据库已经存在了。如果我们用Django来开发一个网站,读职的是之前已经存在的数据库中的数据。那么该如何将模型与数据库中的表映射呢?根据旧的数......
  • 实例034 使用goto语句在数组中搜索指定图书
      usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usi......
  • 数据库设计心得-4班ok_fine_goodnight组
    数据库系统设计心得_ok_fine_goodnight引言首先为什么要设计数据库:当数据库比较复杂(如数据量大,表较多,业务关系复杂)时,我们需要先设计数据库.一个好的数据库设计能保......
  • Orthogonal Quasi-Triangularization
    Theorem.Let \(V\) be a finite-dim'l real ips, and let \(T\) be a linear operator on \(V\). Then there exists an onb \(\beta\) for \(V\)......
  • Springboot使用mongodb遇到问题及解决
    网上看到使用mongodb好像很简单,没有什么问题,可我一用就怎么都连不上,先看看我的配置 在pom.xml中添加依赖 1234<dependency>  <groupId>org.springframew......
  • django中间件以及自定义中间件
    middleware中间件就是在目标和结果之间进行的额外处理过程,在Django中就是request和response之间进行的处理,相对来说实现起来比较简单,但是要注意它是对全局有效的,可以在全......
  • Typora图床上传配置:PicGo+Gitee 不完全指南
    每次写Markdown都要手动传图,再复制链接到Typora里,这样比较繁琐。设置好图床,搭配PicGo,写作时直接剪贴图片到Typora,就能实现自动上传,这样就方便很多。......
  • 协程的简单操作,你都知道哪些?Golang如何实现协程交替打印?
    博主介绍:–我是了凡微信公众号【​​了凡银河系​​】期待你的关注。未来大家一起加油啊~前言对于并发的概念,我们都清楚为了合理利用CPU的执行效率,我们选择当一个事务或......
  • Hugo生成博客静态页面
    Hugo是由Go语言实现的静态网站生成器。简单、易用、高效、易扩展、快速部署。一、安装Hugo推荐使用使用二进制安装,这样简单、快速,具体操作如下:访问HugoGithubRelea......