热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

客户端消息在Agent中的预处理流程。Agent定义好的三种请求:api.govarRCodemap[int16]string{0:heart_beat_re

客户端消息在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服务器的分析了。


推荐阅读
author-avatar
青大柠的小号_247
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有