一个简单的游戏服务器框架

最近看到百度空间的一个帖子,不错,在这里整理下,转载至我的博客里,开始自己慢慢琢磨写一个框架。

我先从上层结构说起,一直到实现细节吧,想起什么就写什么。

第一部分 服务器逻辑
服务器这边简单的分为三个部分,客户端的连接首先到达网关服务器,网关这里有个线程用来监听来自与客户端的连接,然后在将这些数据发送到游戏逻辑服务器上,这个逻辑游戏服务器上,数据的交互就是通过与数据服务器进行交互。RecordServer专门用来处理与数据库的连接,查询这些事情。当然为了游戏服务器能够最大程度的不卡,肯定就得规定好网关服务器上的连接数量,免得像我们号称流畅的铁道部订票网络一样做个卡B,想想玩一局dota被卡的悲剧吧。当我们要做一个大型网游时,这三个服务器显然不够。当然在自己写的小游戏的时候就无所谓了,几个服务器全部架设在自己的破笔记本上,不就是启动几个程序而已。

这个感觉写得就差不多了,到细节吧。

第二部分 实现细节

这个就比较乱了,零零散散的,随便写了。这里很多都是对各种工具的封装,以便于自己 在项目的使用

1.make

项目这么多目录,这么多子目录,肯定得用工具去编译了,使用aclocal,automake,autoconf,make,就把我们的程序编译好了,编写自己configure.in文件,定义编译选项、链接库等等一系列乱七八糟的东西,然后对每个需要编译的子项目编写Makefile.am,有的需要要编译成库的,比如base等基类这些,其他的都编译成可执行文件了,GatewayServer,LogicalServer,RecordServer。

2.套接字封装,epoll使用

linux里,我们使用socket来读写网络上的数据,这个很简单了,gateway上一个客户端连接过来,我们就为它分配一个socket 描述符了,在网关上,一个线程用来accept,一个线程用来做数据的处理,当accept一个连接请求后,放到数据处理的线程,接受到一个数据,然后直接转发到logical server上,我们使用epoll_wait,来处理套接上的读写处理。每n ms处理一次循环,每次循环中使用一次epoll_wait,一次把这些有事件的socket取出来。

3.数据加密解密,压缩解压

对网络上的数据,为了保证安全性,必须对它们进行加密解密处理,这个简单了,网上各种内容,这里就不说了(全部写完了,有时间再写)。对数据进行压缩,能减少带宽吞吐,就是简单的调用几个zlib函数的调用,不细说,在前面转发的《zlib使用》中有讲,发现自己太懒,实在是懒得打字了。

4.线程封装,互斥量,读写锁

这些都是简单的使用RAII或其他方式,对这些东西进行一次本地封装。(应该得写一个线程池去管理这些线程,todo)

5.数据库封装

使用mysql,使用mysql的C API函数,这个必须得封装一下,不是每次数据的处理,都得去做很多事情,实现一个本地的数据的Field(列),Record(记录),Table(表),DataBase(数据库),RecordSet(查询结果集)。制作一个数据库连接句柄MysqlHandle,处理对数据库的连接,处理等,实现一个HandlerPool,,每次从Pool中取出一个句柄来对数据库进行查询,免得每次都去重新连接,什么的。

6.自己的内存池

在之前分享的文章中《内存池技术详解》《编写自己的内存分配器》,自己的《内存池应用》,已经很详细的说明了,内存池的制作,当然我在这里还是有一些改动的,但是大概思路就是这些了。

7.有一个状态机的实现

这个也在自己之前写的那个状态机相关的文章里,也做记录了。哈哈,实在是不想继续码字了,但是还是坚持下去。

8.lua与c++交互框架

这个暂时写了一半,等全部完成了,再来弄,反正就是像npc处理这些,脚本处理这些,使用tolua++。

9.tinyxml封装,正则表达式封装

tinyxml一个轻量级的xml解析器,很简单,反正是把这些现成的东西拿来自己用。正则表达式没有进入c++标准,但是还是很多现成的正则表达式的处理,直接用linux库下的regex.h,就是编译正则表达式,匹配结果这些,

10.log系统

一个项目怎么能没有自己的日志系统呢,反正就是打日志,往文件里面写东西,用std::fstream轻松搞定,定义好日志级别:error / debug / fatel / info这些

11.时间封装

这个必须有,否则自己还每次去调用get_clocktime,gmtime,time各种函数呀。

12.使用boost库里的,Noncopyable,Singleton这些设计方法,来写我们的代码

13.定义好各种信号句柄,信号发生时采用什么策略,如SIGPIPE,做忽略处理

待续。。。。。。。。(睡觉了)

游戏服务器技术应该算来已经很成熟了,相比客户端,它的技术更新速度很慢了。客户端这边,技术很多,各种游戏引擎比如3D的虚幻这些,什么粒子引擎,声音这些,页游的flash, html5,utility,,太多了,搞不过来呀。我先把服务器这边好好专专,其他的等以后再说吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

堆和栈的精华大总结

Java内存分配原理 栈、堆、常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同。 一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但…

算法(11)-leetcode-explore-learn-数据结构-链表的经典问题

leetcode-explore-learn-数据结构-链表31.反转一个链表2.移除链表元素3.奇偶链表4.回文链表5.小结本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/linked-l…

探索式软件测试

James A.Whittaker [美] 詹姆斯惠特克(软件测试领域绝对的大师)著作《Exploratory Software Testing》,中文名《探索式软件测试》,记得当时被这本书深深吸引啦(我不知道有多少做测试的小伙伴看过这本书)&am…

Linux线程池的设计

我设计这个线程池的初衷是为了与socket对接的。线程池的实现千变万化,我得这个并不一定是最好的,但却是否和我心目中需求模型的。现把部分设计思路和代码贴出,以期抛砖引玉。个人比较喜欢搞开源,所以大家如果觉得有什么需要改善的…

算法(12)-leetcode-explore-learn-数据结构-双链表的设计

leetcode-explore-learn-数据结构-链表4双链表的设计本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/linked-list/所有例题的编程语言为python 双链表的设…

安全方面知识

什么是文件上传漏洞 文件上传漏洞是指 由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件 这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。 这种攻击方式是…

CE游戏外挂工具

CHEAT ENGINE(以下简称CE)是我见过的最优秀的游戏作弊工具。它的优点多不胜数,虽然单独从搜索游 戏里面的数值来说,它并不比其他同类软件强多少,但它不仅仅是个游戏修改工具,它还有其他游戏修改软件所没有的一些特点,例…

外挂编程-动作模拟技术

几乎所有的游戏都有大量繁琐和无聊的攻击动作以增加玩家的 功力,还有那些数不完的迷宫,这些好像已经成为了角色游戏的代名词。现在,外挂可以帮助玩家从这些繁琐而无聊 的工作中摆脱出来。 1. 鼠标模拟技术 几乎所有的游戏中都使用了鼠标来改变角色的位置和方向,玩家仅用…

算法(13)-leetcode-explore-learn-数据结构-链表小结

leetcode-explore-learn-数据结构-链表51.小结2.例题2.1合并两个有序链表思路1:迭代思路2:递归2.2 两数相加2.3 扁平化多级双向链表2.4 复制带随机指针的链表2.5 旋转链表本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode…

leetcode121买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,…

epoll的内核实现

epoll是由一组系统调用组成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); select/poll的缺点在于&#xff1…

算法(14)-数据结构-二叉树

leetcode-explore-learn-数据结构-二叉树10.概述1.深度优先遍历dfs1.1先序遍历-中左右1.2中序遍历-左中右1.3后序遍历-左右中2.广度优先遍历bfs3.遍历-常见问题3.1 二叉树的最大深度自顶向下自底向上3.2对称二叉树3.3路径总和4.重构-常见问题4.1根据中序和后序遍历序列构造二叉…

多进程鱼多线程的权衡选择

最近有好多人在网上问道做游戏开发框架用多线程还是多进程呢,或者两者之间的优缺点,等等类似的问题。下边小高就带您小小分析一下: 1、首先要明确进程和线程的含义:进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一…

leetcode322 零钱兑换

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins [1, 2, 5], amount 11 输出: 3 解释: 11 5 5 1 示例 2: 输入: coins [2],…

给数据减肥 让MySQL数据库跑的更快

在数据库优化工作中,使数据尽可能的小,使表在硬盘上占据的空间尽可能的小,这是最常用、也是最有效的手段之一。因为缩小数据,相对来说可以提高硬盘的读写速度,并且在查询过程中小表的内容处理时所占用的系统资源比较少…

算法(15)-leetcode-explore-learn-数据结构-运用递归解决二叉树的问题

leetcode-explore-learn-数据结构-二叉树2本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/

leetcode538 把二叉搜索树转换成累加树

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。 对于每一个点来说,自己的父,和自己父的右子树都是大…

AWK常用命令华(1)

awk 调用: 1.调用awk:

AWk的调用精华

awk 的调用方式 awk 提供了适应多种需要的不同解决方案,它们是: 一、awk 命令行,你可以象使用普通UNIX 命令一样使用awk,在命令行中你也可以使用awk 程序设计语言,虽然awk 支持多行的录入,但是录入长长的命令行并保证其正 确无误却是一件令人头疼的事,因此,这种方法一般…

算法(16)-leetcode-explore-learn-数据结构-二叉树总结

leetcode-explore-learn-数据结构-二叉树3本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/所有例题的编程…