Gonet2 游戏服务器框架解析之Agent(3)

客户端消息在Agent中的预处理流程。
这里写图片描述

Agent定义好的三种请求:

//api.go
var RCode = map[int16]string{
    0:  "heart_beat_req",         // 心跳包..
    1:  "heart_beat_ack",         // 心跳包回复
    10: "user_login_req",         // 登陆
    11: "user_login_succeed_ack", // 登陆成功
    12: "user_login_faild_ack",   // 登陆失败
    13: "client_error_ack",       // 客户端错误
    30: "get_seed_req",           // socket通信加密使用
    31: "get_seed_ack",           // socket通信加密使用
}

上面这段是 api.go中截取的,定义了协议号和对应消息的名称。
以req结尾的是请求,ack结尾的是回复。

//api.go
var Handlers map[int16]func(*Session, *packet.Packet) []byte

func init() {
    Handlers = map[int16]func(*Session, *packet.Packet) []byte{
        0:  P_heart_beat_req,
        10: P_user_login_req,
        30: P_get_seed_req,
    }
}

还是在api.go中,定义了与请求对应的处理方法,这些方法记录在Handlers中。方法的定义在文件client_handler/handle.go中。

在协议号大于1000的另一个分支,消息被封装成了一个Game_Frame,之后转发到了Game服务器,这个对象是由grpc框架生成的。服务的接口以及数据格式定义如下:

syntax = "proto3";

package proto;

// game definition
service GameService {
    rpc Stream(stream Game.Frame) returns (stream Game.Frame);  // 透传消息, 双向流
}

message Game {
    enum FrameType {
        Message = 0;
        Register = 1;
        Unregister = 2;
        Kick = 3;
        Ping = 4;   // for testing
    }
    message Frame {
        FrameType Type=1;
        bytes Message=2;
        int32 UserId = 3;
    }
}

在Game服务器中,有这样一个介绍,

游戏服务器对外只提供一个接口, 即:
rpc Stream(stream Game.Frame) returns (stream Game.Frame);

所以,接下来,就要到Game服务器的分析了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值