admin 发表于 2006-8-9 12:31:00

网游服务端结构设计

1.概述<br/>LoginServer&nbsp;&lt;-----&gt;&nbsp;GameServer<br/>服务端主体分为LoginServer和GameServer,&nbsp;LoginServer做帐户认证,&nbsp;GameServer做游戏主逻辑,<br/>中间也可以加一个CharServer啦,&nbsp;做人物管理,&nbsp;新建删除人物之类的,&nbsp;也可以并到GameServer一<br/>起,&nbsp;LoginServer和CharServer都比较简单,&nbsp;略过.<br/>通过LoginServer的验证后将分配给Client一个SessionID,&nbsp;然后与GameServer或CharServer的通信,<br/>都以此SessionID为认证码.&nbsp;Client只有发送正确的SessionID才能与GameServer建立连接.<br/><br/>2.GameServer层次结构<br/>GameServer分为三层,&nbsp;网络层&lt;---&gt;逻辑处理层&lt;---&gt;数据库层<br/>每层都有一个消息处理队列,&nbsp;存放待处理的消息.&nbsp;消息队列可以采用先进先出队列的方式,&nbsp;也可以<br/>采用堆或者优先队列的方式,&nbsp;按优先级对待处理消息进行简单的排序,&nbsp;嘿嘿,&nbsp;是不是有点类似QoS<br/>的思想.<br/>每层采用线程池技术,&nbsp;预先建立一定数量的空闲线程,&nbsp;&nbsp;不够时建立新线程,&nbsp;过多时则销毁线程,&nbsp;<br/>保证线程池中有指定数量的空闲线程(Min/Max),&nbsp;主线程不断检查处理队列是否有待处理消息,&nbsp;若<br/>有则从线程池中分配一空闲线程处理之.<br/>偶在Linux下线程池是用pthread_cond_wait和pthread_cond_signal实现的.<br/><br/>2.1.网络层<br/>本层根据操作系统不同可以有多种实现,&nbsp;主要功能是与客户端建立TCP连接,&nbsp;将TCP流分割成一个个封包,<br/>如果有加密就解密,&nbsp;如果有压缩就解压缩,&nbsp;加入事务层的处理队列,&nbsp;同时把处理队列中待发送的消息发<br/>送出去,&nbsp;如果要加密就加密,&nbsp;如果要压缩就压缩.<br/>Windows下采用IOCP模型,&nbsp;Unix-like系统下可采用select/poll(epoll)/kqueue<br/>偶在偶的服务端中采用了select方式,&nbsp;Linux单个端口的连接数有限制,&nbsp;所以偶开了多个线程监听一组端口,&nbsp;<br/>由LoginServer做负载均衡,&nbsp;从而保证不会出现某个端口连接数过多的情况.&nbsp;每当有新客户端要登录时,&nbsp;<br/>LoginServer判断每个端口的连接数量,&nbsp;选最小发送给客户端.&nbsp;偶想这里也可以做成动态方式,<br/>当每个端口平均连接数超过XXXX时,&nbsp;就开新线程监听新端口,&nbsp;并通知LoginServer.<br/><br/>2.2.逻辑处理层<br/>本层是GameServer的核心.&nbsp;<br/>根据操作码(OPcode)把消息分配到每个子模块里面处理.&nbsp;最简单的方法就是用从0开始的连续的OPcode,&nbsp;建立<br/>一个与Opcode对应的处理函数的数组,&nbsp;Opcode作为数组的下标,&nbsp;这样只需要O(1)的时间就可以调用到所需的函数<br/>连Hash都省了,&nbsp;又简单又高效.<br/>子模块详见第7部分<br/><br/>2.3.数据库层<br/>本层用于数据存储,&nbsp;本质上就是把内存里的数据存到硬盘上,&nbsp;要是你够拽的话,&nbsp;可以不用现有的数据库,&nbsp;<br/>自己写算法存储文本文件,&nbsp;但为了方便起见,&nbsp;也为了提高效率,&nbsp;还是用数据库比较好.<br/>windows下用MSSQL,&nbsp;或者用MYSQL,&nbsp;<br/>Unix-like系统下可以用的就多了,&nbsp;能多兼容几种数据库最好<br/>MYSQL的性能优异,&nbsp;功能上稍差一点,&nbsp;如果不需要用到存储过程的话,&nbsp;MYSQL还是首选的.<br/>数据库层一般用单线程已经足够,&nbsp;可以不需要做对象互斥,&nbsp;编程方面也会简单一点.&nbsp;但是需要注意的是,&nbsp;<br/>数据库操作方面一定要用Transaction,&nbsp;可以有效防止复制现象发生,&nbsp;比如:交易操作一旦发生错误,&nbsp;则<br/>rollback到交易之前,&nbsp;不会发生钱已交出,&nbsp;东西却没拿到的情况.<br/><br/>3.消息格式定义<br/>3.1.网络层&lt;--&gt;逻辑层消息格式(网络封包格式)<br/>3.2.逻辑层&lt;--&gt;数据库层消息格式<br/><br/>4.游戏对象定义(Object)<br/>object&nbsp;<br/>&nbsp;&nbsp;|-------&gt;&nbsp;item<br/>&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|----&gt;&nbsp;container(容器类对象,如仓库、背包等)<br/>&nbsp;&nbsp;|<br/>&nbsp;&nbsp;|-------&gt;&nbsp;unit&nbsp;<br/>&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-----&gt;&nbsp;player<br/>&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-----&gt;&nbsp;monster<br/>&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-----&gt;&nbsp;npc<br/>&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-----&gt;&nbsp;corpse(尸体对象)<br/>&nbsp;&nbsp;|<br/>&nbsp;&nbsp;|-------&gt;&nbsp;gameobj&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-----&gt;&nbsp;dynamicobj(如技能产生的临时对象)<br/>&nbsp;&nbsp;<br/>5.地图场景管理<br/>6.脚本系统<br/>7.逻辑层模块化设计 <br/><br/>

totter 发表于 2006-8-30 14:16:00

怎么越看越象传奇私服的服务器架构哦??嘿嘿!

雅薇 发表于 2006-9-23 12:00:00

看不懂

billwillman 发表于 2006-10-1 22:14:00

<p>顶</p><p>正在做这一块</p>

John 发表于 2006-12-27 16:37:00

<p>ding&nbsp; . </p>

lovemaxmax 发表于 2007-5-5 06:20:00

支持~~

konyka 发表于 2007-11-1 18:28:00

回复:网游服务端结构设计

支持
页: [1]
查看完整版本: 网游服务端结构设计