Skip to content

进阶使用

sundream edited this page Jun 20, 2019 · 3 revisions

第一个协议

ggApp公共协议放在tools/proto下,以sproto为例,新增请求C2GS_AreYouOk,回复GS2C_IamFine

  • 新增tools/proto/sproto/test.sproto文件,内容如下
# [100,200)
# C2GS
C2GS_AreYouOk 100 {
	request {
		speaker 0 : string
	}
}

# GS2C
GS2C_IamFine 150 {
	request {
		speaker 0 : string
	}
}
  • 生成二进制协议,并且同步到gameserver,client,robot
cd ~/ggApp/tools/proto/sproto
sh run_on_change.sh
如果提示: ignore copy,because GGAPP_ROOT not set!,则先到~/ggApp目录下执行sh setup_linux.sh
  • 新增gameserver/src/app/net/test.lua,内容如下:
local nettest = nettest or {
	C2GS = {},
	GS2C = {},
}

local C2GS = nettest.C2GS
local GS2C = nettest.GS2C

function C2GS.AreYouOk(linkobj,message)
	local args = message.args
	gg.client:sendpackage(linkobj,"GS2C_IamFine",{
		speaker = args.speaker,
	})
end

function __hotfix(module)
	gg.hotfix("app.net.net")
end

return nettest
self:register_module("test",require("app.net.test"))
  • 热更协议+协议处理脚本
cd ~/ggApp/gameserver/shell
sh gm.sh 0 hotfix 'proto.sproto.all.spb'
sh gm.sh 0 hotfix 'app.net.test'
  • 重启客户端,发送C2GS_AreYouOk看看效果
cd ~/ggApp
client/3rd/lua/lua client/app/app.lua
# 执行如下指令
linkobj = connect("127.0.0.1",8888)
linkobj:send_request("C2GS_AreYouOk",{speaker="lgl"})

修改配置

  • 数据库

    • 支持类型
      当前支持mongodb,redis两种数据库,默认使用mongodb
    • 游戏服
      可在gameserver/src/app/config/custom.config中更改db_type,db_config字段来配置
    • 登录服
      可在gameserver/app/lua/server/account/custom.lua中更改db_type,db_config字段来配置
  • 编码协议

    • 支持类型
      当前支持json,protobuf,sproto三种编码协议,默认使用json
    • 游戏服
      可在gameserver/src/app/config/custom.lua中更改proto字段来配置
    • 客户端
      可在client/app/config.lua中更改proto字段来配置
    • 压测工具
      可在robot/app/config/custom.lua中更改proto字段来配置
  • 游戏服网关

    • 支持类型
      当前支持3类网关,分别为tcp,kcp,websocket,默认3个网关均开启,可在gameserver/src/app/config/gameserver_xxx.config中配置,默认http_port=8886,websocket_port=8887,tcp_port=8888,kcp_port=8889,如果去掉配置则不开启对应类型网关,当然你也可以更改端口。你可以平等的混合使用不同网关,也可以主从使用不同网关(比如以tcp为主,kcp为辅,并建立tcp和kcp的主从关系,当tcp绑定玩家后,玩家即可选择使用tcp/kcp来发送协议)

    • 握手方式

      • 支持类型
        nil/false--不握手,"nil"--握手告知客户端不加密,其他--握手时和客户端协商密钥,默认不进行握手
      • 游戏服
        可在gameserver/src/app/config/common.config中更改encrypt_algorithm字段来配置
      • 客户端
        修改client/app/config.lua中handshake字段,true--进行握手,false--不进行握手
      • 压测工具
        修改robot/app/config/custom.lua中handshake字段,true--进行握手,false--不进行握手
    • tcp为主,kcp为辅与服务器通信
      主从关系与服务器通信要求开启握手,用户可以选择在握手阶段是否建立主从关系,使用client演示如下:

      cd ~/ggApp
      client/3rd/lua/lua client/app/app.lua
      # 建立tcp连接
      tcpoobj = connect("127.0.0.1",8888)
      # 开启握手后,连接完毕可以获得服务端的tcp连接ID
      print(tcpobj.linkid)
      # 建立kcp连接,并且与tcp连接建立主从关系
      kcpobj = kcp_connect("127.0.0.1",8889,tcpobj.linkid)
      主从关系建立后,服务端生成的tcp连接对象身上的slave字段即为kcp连接对象,kcp连接对象身上的master字段即为tcp连接对象,因此
      // tcp方式通信
      gg.client:sendpackage(tcp_linkobj,协议名,协议参数)
      // kcp方式通信
      gg.client:sendpackage(tcp_linkobj.slave,协议名,协议参数)
      假定tcp_linkobj在服务端绑定了player玩家(登陆完毕后连接对象会和玩家绑定),通过玩家通信方式如下
      // 使用玩家ID通信(默认用绑定玩家的连接对象通信,这里即为tcp_linkobj)
      gg.client:sendpackage(player.pid,协议名,协议参数)
      // tcp方式通信
      gg.client:sendpackage(player.linkobj,协议名,协议参数)
      // kcp方式通信
      gg.client:sendpackage(player.linkobj.slave,协议名,协议参数)
      
Clone this wiki locally