前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >einx: 一个用Go构建的游戏服务器

einx: 一个用Go构建的游戏服务器

作者头像
李海彬
发布于 2018-12-05 03:45:43
发布于 2018-12-05 03:45:43
2K00
代码可运行
举报
文章被收录于专栏:Golang语言社区Golang语言社区
运行总次数:0
代码可运行

原文作者:Cyinx

einx

a framework in golang for game server or app server.

a example server for einx (https://github.com/Cyinx/game_server_einx)


einx 是一个由 golang 编写的用于游戏服务器或者应用服务器的开源框架。

设计核心:

  • 模块与组件的组合机制,模块是逻辑核心。
  • lua脚本
  • 按业务分离逻辑

  • einx/db 组件化数据库相关操作
  • einx/network 组件化网络IO,目前只支持TCP
  • einx/log 异步日志库
  • einx/timer 时间轮定时器
  • einx/module 模块
  • einx/component 组件
  • einx/lua 脚本相关操作

模块与组件

每个模块有且仅有一个goroutine用于处理被投递到本模块中的消息,在模块中的逻辑不需要考虑同步问题,简化了逻辑开发难度,模块与模块之间可以通过RPC交互

使用 einx 搭建一个简单的服务器

首先安装 einx

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/Cyinx/einx.git

创建一个简单的einx例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mainimport (	"github.com/Cyinx/einx"
	"github.com/Cyinx/einx/slog")func main() {
	slog.SetLogPath("log/game_server/")
	slog.LogInfo("game_server", "start server...")
	slog.LogInfo("game_server", "hello world...")
	einx.Run()
	einx.Close()
}

einx的核心是module,module中可以添加各种component作为组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cyinx/einx/network	网络相关的component
Cyinx/einx/db		数据库相关的component

创建一个TCPServer的component管理器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package clientmgrimport (	"github.com/Cyinx/einx"
	"github.com/Cyinx/einx/slog"
	"msg_def")type Agent = einx.Agenttype AgentID = einx.AgentIDtype EventType = einx.EventTypetype Component = einx.Componenttype ComponentID = einx.ComponentIDtype ClientMgr struct {
	client_map map[AgentID]Agent
	tcp_link   Component}var Instance = &ClientMgr{
	client_map: make(map[AgentID]Agent),
}func (this *ClientMgr) GetClient(agent_id AgentID) (Agent, bool) {	client, ok := this.client_map[agent_id]	return client, ok
}func (this *ClientMgr) OnLinkerConneted(id AgentID, agent Agent) {
	this.client_map[id] = agent //新连接连入服务器}func (this *ClientMgr) OnLinkerClosed(id AgentID, agent Agent) {	delete(this.client_map, id) //连接断开}func (this *ClientMgr) OnComponentError(c Component, err error) {

}func (this *ClientMgr) OnComponentCreate(id ComponentID, component Component) {
	this.tcp_link = component
	component.Start()
	slog.LogInfo("tcp", "Tcp sever start success")
}

创建一个逻辑module,并将TcpServer管理器加入到module之中,服务器就可以启动,并监听2345端口的请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package mainimport (	"clientmgr"
	"github.com/Cyinx/einx"
	"github.com/Cyinx/einx/slog")var logic = einx.GetModule("logic")func main() {
	slog.SetLogPath("log/game_server/")
	logic.AddTcpServer(":2345", clientmgr.Instance)
	slog.LogInfo("game_server", "start server...")
	einx.Run()
	einx.Close()
}

注册消息handler与Rpc: 注册消息handler需要事先注册一个Message:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package msg_defimport (	"github.com/Cyinx/einx/network"
	"protobuf_gen")type VersionCheck = pbgen.VersionCheckvar VersionCheckMsgID = network.RegisterMsgProto(uint16(pbgen.MainMsgID_GENERAL_MSG),	uint16(pbgen.HandlerMsgID_VERSION_CHECK),
	(*VersionCheck)(nil))

在注册RPC时,使用字符串作为RPC名,注册handler时,需要使用之前注册的MsgID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (	"msg_def")var logic = einx.GetModule("logic")func InitDBHandler() {
	logic.RegisterRpcHandler("testRpc", testRpc)
	logic.RegisterHandler(msg_def.VersionCheckMsgID, CheckVersion)
}func testRpc(sender interface{}, args []interface{}) {

}func CheckVersion(agent Agent, args interface{}) {	version_check_msg := args.(*msg_def.VersionCheck)	
}

注册定时器使用module.AddTimer函数,返回值为timerID,如果要提前停止timer,可以执行module.RemoveTimer(timerid):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (	"msg_def")var logic = einx.GetModule("logic")var testTimerID uint64 = 0func InitDBHandler() {
	logic.RegisterRpcHandler("testRpc", testRpc)
	logic.RegisterHandler(msg_def.VersionCheckMsgID, CheckVersion)
}func testRpc(sender interface{}, args []interface{}) {	if testTimerID != 0 {
	  logic.RemoveTimer(testTimerID)
	}
}func TestTimer(args []interface{}) {
	testTimerID = 0}func CheckVersion(agent Agent, args interface{}) {	version_check_msg := args.(*msg_def.VersionCheck)	
	testTimerID = logic.AddTimer(1000,TestTimer,1,2,"测试")
}

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
新版PubMed伴侣_Scholarscope用法大全:IF、分区、Endnote导入文件、下载全文
Scholarscope是国内开发的一款浏览器插件,主要解决文献影响因子显示的问题。它能自动加载 PubMed 期刊的影响因子,帮助用户筛选更为优质的文献;此外还有一些其他的好用功能,如查看杂志的分区、导出Endnote引用格式的文本、添加文献下载链接,在校外也能一键下载文献(基于Sci-Hub)等。
用户6317549
2020/07/10
11.2K0
好物推荐 | EasyPubMed(学术文献查询插件)
EasyPubMed插件能快速查询不同文献库的数据,第一时间了解各大期刊的论文动态,并且获取杂志的影响因子等数据,根据关键字、单位等信息快速筛选所需内容,还能对文本进行快速翻译,极大提升了科研人员的学术研究效率,有兴趣的小伙伴快来下载体验吧!
生信技能树
2022/06/08
8.7K0
好物推荐 | EasyPubMed(学术文献查询插件)
更好的科研辅助工具-scholarscope
Web: https://www.scholarscope.cn/index.html
DrugScience
2021/03/04
1K0
更好的科研辅助工具-scholarscope
如果你经常用PubMed,那么这个插件将非常好用!
在之前的文章『如何让PubMed自动显示最新影响因子并一键免费下载文献!』中,科研小助手为大家介绍了一款PubMed的插件PubMedy,可惜这个只支持Chrome以及Chrome内核的浏览器,对于F
生信宝典
2018/06/26
1.5K0
Word天,这样操作可以让Sci-hub如影随形!
最近总能看到群里有人问最新的Sci-Hub地址,或者压根不知道这个,求助文献下载的,小编就旧文新发一遍,方便大家下载文献,下载英文文献基本不需要再求人了,中文也基本没什么问题。
DoubleHelix
2019/08/07
3.7K0
Word天,这样操作可以让Sci-hub如影随形!
PubMed专题:(二)搜索结果的阅读、筛选、下载、保存与利用
对文献检索来说,搜索是极为关键的第一步,直接决定了搜索结果里面有没有你想要的。因此,对PubMed搜索还不是很熟悉的读者,可以结合第一期推送教程,加以操作实练,相信定会掌握不少。
微点
2019/05/09
5.7K0
PubMed超强插件:JCR/中科院分区、期刊黑名单、IF和即时IF从此一目了然,还能秒下文献
Pubmed作为生物医药研究者最常用的免费文摘数据库,素有检索江湖上的泰山北斗之称,用好Pubmed,其他一切pubmed镜像网站都是浮云。
用户6317549
2022/05/25
20.3K2
PubMed超强插件:JCR/中科院分区、期刊黑名单、IF和即时IF从此一目了然,还能秒下文献
火狐插件之Scholarscope(查影响因子和看全文)
作为火狐浏览器(Firefox)的忠实粉丝兼科研爱好者,米老鼠当然不会放过在火狐里寻找能够辅助科研的各种小工具了,今天就和大家分享一款特别实用的火狐插件“Scholarscope”,中文翻译为学术探索,听名字是不是就很霸气?当然它的功能更霸气,它可以直接在PubMed里显示SCI杂志的影响因子,可以直接给出文献的Sci-Hub链接,让你随时随地享受高效而舒适的科研生活。话不多说,咱们赶快来一起学习一下吧!
生信与临床
2020/08/06
6.1K0
火狐插件之Scholarscope(查影响因子和看全文)
三款科研相关谷歌插件推荐
在个人浏览器的使用上,一直在使用谷歌浏览器。主要原因还是在于很多开发者基于谷歌浏览器开发了很多辅助工作的插件,这些插件可以提高我们在科研检索的时候的效率。今天就来给大家推荐几个谷歌浏览器的插件吧!
医学数据库百科
2020/06/01
1.8K0
三款科研相关谷歌插件推荐
什么!都已经9102年了,你还在用pubmed搜文献吗?
说到搜索英文文献,最常用的应该就是Pubmed了,但是Pubmed远非十全十美,比如说Pubmed就有以下缺点:
百味科研芝士
2019/05/23
1.4K0
01. 复习mark down语法
从官网可以下载到适配不同浏览器的 scholarscope插件:http://blog.scholarscope.online,非常详细,一看就会。
清南
2023/04/13
5040
分享| PyPubMed文献搜索整理小工具
欢迎回来,科研的日常总避不开要查阅、下载整理文献。之前我们推荐过不同的方法,例如NCBI加谷歌助手、SCI-hub代替网站、中文期刊下载方法等。但都还是停留在手动层面,今天分享一个最近看到自动化小工具,不仅在下载中添加了条件筛选,将文献检索与摘要输出excel表格,我扒了它的github仓库,一起来看看吧~
生信菜鸟团
2021/03/23
7120
推荐5款Chrome科研神器插件!
从学术网站浏览到文献阅读下载,再到文章润色纠错,可以说是豪华全家桶科研套餐,让你的Chrome秒变科研神器!
科研菌
2021/02/19
9.7K0
推荐5款Chrome科研神器插件!
你该知道的杂志分区和影响因子及2018最新影响因子下载
ISI每年出版JCR期刊引用报告 (Journal Citation Reports)评估期刊的影响力。
生信宝典
2018/08/01
2.1K0
生物医学领域科研工作者的软件和工具清单-3.0版本
微软的Office和金山的WPS,大家不陌生,应该都有。WPS免费,Office需要破解,这里提供破解版下载地址:
DoubleHelix
2020/07/03
3.3K0
生物医学领域科研工作者的软件和工具清单-3.0版本
【选刊神器】如何找到适合投稿的目标期刊?选刊从此变得轻松又高效
不论处在科研级别的哪个阶段,青铜或王者,每当投稿的时候,是否或多或少会遇过这个问题?我实验做完了,文章也写好了,就差临门一脚---投稿,然而这一脚却不知踹向何处?
用户6317549
2022/04/09
13.5K0
【选刊神器】如何找到适合投稿的目标期刊?选刊从此变得轻松又高效
【学术分享】40个科研学术网站,收藏必备,予取予求!
科研工作者每天日常莫过于看文献、做实验、写论文。人生最郁闷的事情不过于是导师说,那个XX,帮我下载下这个文献,还有这篇文章很好,你把他的引用文献都大概读一下
zenRRan
2019/12/26
7K0
【学术分享】40个科研学术网站,收藏必备,予取予求!
【一条工具】教你如何访问谷歌
嗨喽!一条IT的各位小伙伴们,由于公众号做了乱序推送改版,为了保证公众号的资源推送,能够第一时间及时送达到大家手上,大家记得将一条的公众号 加星标置顶 ,公众号每天会送上一款实用工具 !
一条coding
2021/08/12
18.4K0
【一条工具】教你如何访问谷歌
这可能是史上最全的常用学术网站
搞科研我们都知道,少不了各个学术网站的助力呢!今天小编特地收集了国内外常用学术网站,对你有用就点个赞吧!欢迎微信后台留言补充。
AI算法与图像处理
2019/08/15
4.2K0
这可能是史上最全的常用学术网站
完整教程:沉浸式翻译插件安装、使用与OpenAI API Key配置指南
在信息爆炸的时代,语言不应再成为我们探索世界、获取知识的阻碍。想象一下,无论是浏览英文网站的前沿科技资讯,还是观看西班牙语电影的精彩剧情,亦或是研读德语的专业文献,都能像阅读母语一样轻松自如,这将是多么高效便捷的体验!
网名重要么
2025/04/12
1.5K0
推荐阅读
相关推荐
新版PubMed伴侣_Scholarscope用法大全:IF、分区、Endnote导入文件、下载全文
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验