{"id":13711380,"url":"https://github.com/zhangqi-ulua/ServerFramework","last_synced_at":"2025-05-06T20:33:11.756Z","repository":{"id":36095124,"uuid":"205958543","full_name":"zhangqi-ulua/ServerFramework","owner":"zhangqi-ulua","description":"可用作全球同服或滚服的分布式Java游戏服务器框架，附带若干实用工具和游戏客户端","archived":false,"fork":false,"pushed_at":"2023-08-04T19:27:46.000Z","size":13878,"stargazers_count":139,"open_issues_count":37,"forks_count":83,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-11-13T21:45:03.011Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhangqi-ulua.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-03T00:44:15.000Z","updated_at":"2024-09-29T08:31:33.000Z","dependencies_parsed_at":"2024-05-13T00:44:42.185Z","dependency_job_id":null,"html_url":"https://github.com/zhangqi-ulua/ServerFramework","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhangqi-ulua%2FServerFramework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhangqi-ulua%2FServerFramework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhangqi-ulua%2FServerFramework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhangqi-ulua%2FServerFramework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhangqi-ulua","download_url":"https://codeload.github.com/zhangqi-ulua/ServerFramework/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252764787,"owners_count":21800748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T23:01:07.619Z","updated_at":"2025-05-06T20:33:06.690Z","avatar_url":"https://github.com/zhangqi-ulua.png","language":"Java","funding_links":[],"categories":["Frameworks","网络编程"],"sub_categories":["语音合成"],"readme":"# ServerFramework\n## 它是什么？\n是可用作全球同服或滚服的分布式Java游戏服务器框架，附带若干实用工具和游戏客户端。与客户端通讯使用Netty框架，采用WebSocket，适合手游和H5游戏（如微信小游戏），也可以简单修改转而使用Socket等。框架中的服务器类型分为GM服务器（GM）、逻辑服务器（LogicServer）、战斗服务器（BattleServer）、网关服务器（Gateway），服务器之间的通讯使用Akka框架，处理服务器并发问题，也是利用Akka框架的Actor模型思想\n## 为什么要做它并开源它？\n入行至今，很高兴能作为游戏制作人和后端主程序，做了两款原创玩法的策略竞技游戏[\u003cb\u003e《萌猪突击》\u003c/b\u003e](https://www.taptap.com/app/150942)和[\u003cb\u003e《卡牌串串》\u003c/b\u003e](https://www.taptap.com/app/174662)。我热爱需要动脑的游戏类型（比如CCG、DBG、解谜、桌游等），更喜欢创新最好是全新玩法的游戏。虽然行业的同质化现象越来越严重，抄袭屡见不鲜，“微创新”成为至理名言。但近年来，TapTap上涌现出越来越多的个人或几人的小团队，在不断推出原创玩法的新颖游戏。他们都有着做原创好游戏的理想，有些朋友甚至为了实现游戏，从完全不相干的行业中跳出来，从0开始自己学习编程来实现。但技术上毕竟是不能一蹴而就的，于是开测即炸服基本成了小团队发布游戏的现状，而炸服并不是由于玩家热情太高，涌入访客太大，很大程度上还是技术方面不过关，几百甚至几十的在线，都会出现服务器明显卡顿的问题。相比之下，程序bug相对成熟团队也多太多。所以，我想将我做这两款游戏时所用的服务器框架进行重新整理和开源，希望尽一份微薄之力，能帮助想做原创游戏，但被技术方面问题困扰的战友们。希望这个框架能简化服务器的开发，让大家更专注于游戏玩法的实现，而不是头疼于服务器框架的搭建\n## 交流与反馈\n我的QQ及对应邮箱是：2246549866@qq.com   我所有开源项目的反馈交流QQ群为：132108644  （含之前XlsxToLua、国际化工具等）\u003cbr/\u003e\n由于本人能力有限，如果您对这个框架有任何改进建议，期待您能不吝赐教\n## 服务器框架介绍（其他细节参看doc目录下的“说明.txt”，之后会有更详细的Wiki）\n### 服务器功能说明\n#### GM服务器（GM）：\n1、作为中心管理的服务器，其他各类服务器在启动后，需要连接GM服务器进行注册（类似自己实现了一个精简够用的ZooKeeper）。2、游戏客户端要连上游戏服务器时，先访问GM服务器，获取一个最空闲的Gateway服务器地址。3、GM客户端通过登录验证后，向GM服务器发送命令，由GM服务器管理其他指定服务器执行具体GM命令（比如对线上服务器进行表格更新、停服维护操作，对指定玩家或系统模块执行GM操作，修改各项数据等）\n#### 逻辑服务器（LogicServer）：\n处理游戏逻辑相关的请求，其中需要指定一台为主逻辑服务器，只有主逻辑服务器处理玩家注册、游戏对战匹配。其他逻辑服务器可以有若干台，支持分布式扩展\n#### 战斗服务器（BattleServer）：\n处理游戏对战相关的请求，可以有若干台，支持分布式扩展\n#### 网关服务器（Gateway）：\n由客户端进行连接，根据负载分配给玩家连接的逻辑服务器。将客户端请求根据类型分别发往对应逻辑服务器或战斗服务器，可以有若干台，支持分布式扩展\n### 数据存储\n因为在数据存储上不同开发者的使用习惯往往很不相同，不同类型游戏的数据存储需求也不同，本框架这一部分仅采用Redis作为中心数据库演示服务器框架的作用，各位开发者可根据具体需求进行替换\n### 通讯协议\n客户端与服务器间的二进制通讯数据包：\u003cbr/\u003e\n第1个4字节（1个int）为整个数据包的总字节数（含所有部分，包括这4字节）\u003cbr/\u003e\n第2个4字节为协议名对应的数字\u003cbr/\u003e\n第3个4字节为errorCode对应的数字\u003cbr/\u003e\n剩下的部分为要发送的具体protobuf协议转为的二进制内容\u003cbr/\u003e\n其中errorCode为客户端与服务器约定的已知错误码，如果客户端向服务器所发请求，经过服务器验证认为有误，服务器会返回对应错误码给客户端。客户端与服务器具体请求与回应或是推送的内容，通过protobuf协议进行定义，并最终转为字节流发送\n### 提供的样例\n目前框架中，除了实现各服务器间通讯协作的基本框架功能以外，还实现了一些具体功能为您提供参考\u003cbr/\u003e\n1、玩家注册、登录，通过主服务器进行对战匹配，2个玩家匹配成功后，进行回合制的实时PVP的井字棋对战\u003cbr/\u003e\n2、GM功能，控制各个服务器执行比如重载表格、关服维护等操作。也可以查看在线玩家详情\n## 附带开源工具及客户端介绍\n### RedisDataViewer：\n虽然市面上有一些第三方的Redis可视化查询操作工具，但一是筛选功能比较弱，比如对ZSet类型，无法限定查询指定index范围内或者指定分数范围内的数据，二是对于存储的protobuf类型转为的二进制数据，没有提供进行反序列化为可读文本查看的功能。因此，我做了这个工具解决上面2个问题。对Hash、List、ZSet均提供具体查询功能，对protobuf序列化存储的数据，可以反序列化为可读文本查看\u003cbr/\u003e\n使用方法：在“redisKeyConfig.txt”配置文件中，根据格式要求（唯一id@分组（不分组则留空）@描述@key名格式@protobuf数据所对应的protobuf类名（非protobuf数据留空）@redis的数据类型（string、hash、list、set、zset）@备注信息）进行配置。就可以在打开工具时，选择这些配置对应的Redis数据进行查看。另外，默认配置文件中，已经将服务器框架中所用到的所有Redis数据都进行了配置登记，可以直接使用，也作为配置的实例供您参考\u003cbr/\u003e\n![](https://github.com/zhangqi-ulua/ServerFramework/blob/master/doc/screenshots/RedisDataViewer1.png)\u003cbr/\u003e\n![](https://github.com/zhangqi-ulua/ServerFramework/blob/master/doc/screenshots/RedisDataViewer2.png)\u003cbr/\u003e\n![](https://github.com/zhangqi-ulua/ServerFramework/blob/master/doc/screenshots/RedisDataViewer3.png)\u003cbr/\u003e\n### TestServerFramework（游戏客户端实现）\n用C#.NET做的WinForm程序，实现了游戏客户端（井字棋）功能\u003cbr/\u003e\n![](https://github.com/zhangqi-ulua/ServerFramework/blob/master/doc/screenshots/TestServerFramework1.png)\u003cbr/\u003e\n### GameManager：\n用C#.NET做的WinForm程序，实现了GM客户端，可管理服务器执行GM命令，查询在线玩家详情\u003cbr/\u003e\n![](https://github.com/zhangqi-ulua/ServerFramework/blob/master/doc/screenshots/GameManager1.png)\u003cbr/\u003e\n![](https://github.com/zhangqi-ulua/ServerFramework/blob/master/doc/screenshots/GameManager2.png)\u003cbr/\u003e\n### 自动编译打包及运行\n在trunk\\tools\\release\\AutoBuildServer中，执行“build.bat”可自动将所有类型的服务器通过Maven进行打包（需提前安装并配置好Maven的环境变量）执行“onekey run.bat”可自动启动Redis数据库并启动各个服务器\u003cbr/\u003e\n![](https://github.com/zhangqi-ulua/ServerFramework/blob/master/doc/screenshots/AutoBuildAndRun.png)\u003cbr/\u003e\n## 其他说明\n### protobuf的编译\n在trunk\\proto中执行“compile.bat”，可编译服务器所需Java版本的protobuf以及客户端工具所需的C#版本。另外，通过“编译使用proto的工具.bat”，会调用Visual Studio将全部客户端工具重新编译为可执行程序\n### 配置表格的使用\n在trunk\\tableConfig下放置所需的配置表格。导表工具使用我开源的[\u003cb\u003eXlsxToLua\u003c/b\u003e](https://github.com/zhangqi-ulua/XlsxToLua)（具体使用方法请移步查看），导出路径和参数等已经做好了默认配置\n\n## 赞助\n如果您觉得软件还不错，并且愿意请作者喝杯咖啡的话，欢迎打赏\u003cbr/\u003e\n\u003cimg src=\"https://github.com/zhangqi-ulua/FiddlerHeadConvertor/blob/main/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/wechat.jpg\" width=\"40%\"\u003e\n\u003cimg src=\"https://github.com/zhangqi-ulua/FiddlerHeadConvertor/blob/main/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/alipay.jpg\" width=\"40%\"\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhangqi-ulua%2FServerFramework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhangqi-ulua%2FServerFramework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhangqi-ulua%2FServerFramework/lists"}