根据前面文章的协议 golang制作一个斗地主游戏服务器[7]:服务器和协议的一些想法
message TDDZ
{
message THeader
{
头部应该包含很多内容, 目前先不填
}
optional THeader Header = 1;
optional int32 Command = 2;
optional TGetServerInfoReq GetServerInfoReq = 11;
optional TGetServerInfoRsp GetServerInfoRsp = 12;
optional TGetTableInfoReq GetTableInfoReq = 13;
optional TTableInfo TableInfo = 14;
optional TGetTableInfoRsp GetTableInfoRsp = 15;
optional TJoinTableReq JoinTableReq = 16;
optional TJoinTableRsp JoinTableRsp = 17;
optional TPlayerInfo PlayerInfo = 18;
optional TPlayerComeInBc PlayerComeInBc = 19;
optional TGameStartBc GameStartBc = 20;
optional TDealCardBc DealCardBc = 21;
optional TCallDZBc CallDZBc = 22;
optional TCallDZReq CallDZReq = 23;
optional TCallDZRsp CallDZRsp = 24;
optional TOutCardBc OutCardBc = 25;
optional TOutCardReq OutCardReq = 26;
optional TOutCardRsp OutCardRsp = 27;
optional TGameOverBc GameOverBc = 28;
}
这里制定一个需要发送的最终的协议, 里面包含住所有需要的发送的协议的集合
看起来不是一个很好的方法, 但是是最简单的方法.
protoc.exe --plugin=protoc-gen=protoc-gen-go.exe --go_out=../ *.proto
通过上面的命令把原始的pb文件转成 golang 使用的 pb.go文件
里面有两个文件 一个是把proto转成pb中间文件的 protoc.exe, 可以自己用MAKE去编译一份官方版本, 另一个是把pb中间文件变成pb.go的 gen-go.exe
找不到的话可以在这里下载https://github.com/266game/tools/tree/master/protobuf2
成功执行命令以后会生成一个 ddzpb.pb.go 文件, 暂时放着不管它先
-------------------------------------------------------------------------------------------------------------
回到客户端给服务器发送协议
弄一个新按钮 Btn2
// OnFormCreate 主窗口创建事件
func (self *TMainForm) OnFormCreate(sender vcl.IObject) {
self.SetCaption("这是一个游戏服务器")
self.Btn1 = vcl.NewButton(self) // 创建按钮
self.Btn1.SetParent(self) //设置爸爸
self.Btn1.SetBounds(10, 10, 88, 28) //设置位置
self.Btn1.SetCaption("开始连接") //
self.Btn1.SetOnClick(self.OnButton1Click) // 绑定按钮1点击事件
self.Btn2 = vcl.NewButton(self)
self.Btn2.SetParent(self) //设置爸爸
self.Btn2.SetBounds(10, 50, 88, 28) //设置位置
self.Btn2.SetCaption("快速加入") //
self.Btn2.SetOnClick(self.OnButton2Click) // 绑定按钮1点击事件
}
// OnButton2Click 快速加入 按钮点击事件
func (self *TMainForm) OnButton2Click(sender vcl.IObject) {
pack := &ddzpb.TDDZ{}
pack.Command = proto.Int32(11) // 假装发送获取服务器信息
buff, _ := proto.Marshal(pack)
self.pClient.WritePack(buff)
}
在服务器端这边解包
// 启动服务器, 首先要连接中心服务器
pServer := tcpserver.NewTCPServer()
pServer.OnRead = func(pData *connection.TData) {
//
pack := &ddzpb.TDDZ{}
proto.Unmarshal(pData.GetBuffer(), pack)
log.Println("收到包", pack)
}
这样一个基础TCP就搞定了