QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 998|回复: 2

关于 网络小游戏的通用服务器平台...

[复制链接]
发表于 2004-1-17 23:02:32 | 显示全部楼层 |阅读模式
网络游戏有很多种,联众这种就属于小游戏,传奇之类就不是了,因为此类“小游戏”技术相对不太复杂,所以还是比较可行滴~
“通用”二字何解?就是说,这个“服务器平台”不是某个游戏专用的,联众也就是这样的。
一时没找到GameSrv的代码,先谈谈我的想法吧:
因为服务器不是针对某个游戏而开发,所以网络通信的协议(也就是如何包装和解析数据)就得全由客户端提出,服务器按照规则办事而已。一般的小游戏,典型代表是棋牌类的游戏,它们都包含着人与人之间的竞技甚至争斗,所以需要作为“第三方”的服务器来维护游戏的公平性和对游戏结果评价的公正。所以,服务器端需要有一个模块用来检测每个客户端发出的数据报的合法性,还有保存游戏状态等。每个游戏在客户端都有一个客户端软件或客户端插件,在服务器端都有一个对应的模块。

关于服务器端的模块:
Game类:
一个服务器中可能会存在此类的多个实例。
每一个Game类的实例都对应了一个游戏,也就是游戏桌或房间的概念,它里面保存了这个游戏里所有的数据,当然还要有相关的成员函数;比如:假如是一个五子棋的游戏,那么其成员变量中就有一个二维数组,成员函数负责处理某个客户端发出的数据报的合法性,向房间中的人广播游戏数据,判断游戏的胜负等。当某个游戏结束时,其对应的对象也将被delete,在析构函数中还要包括一些数据的处理,特别是如果有积分制度的话还得计算和累加积分。但是,所有game的网络操作都是统一进行的,也就是说一个Game类实例要向玩家广播数据时只是把数据包送给服务器平台,自己并不进行socket操作,收到数据也是由服务器平台引起的,同样不会自己去读取socket。
run(),一个函数(详细功能见下文),并没有包含在任何类中,其内容是:
[code:1]
{
  while(1==gaming){
    <游戏循环的内容>
  }
  <进行游戏结束时的收尾工作>
}
[/code:1]
Manage类:
一个服务器中只有此类的一个实例。
它负责管理这种游戏的所有Game类的实例:
1。当服务器平台告知此模块有用户申请开启一个新游戏时,它将创建一个新的Game类的实例,并创建一个新的线程去处理此Game类实例,这个线程中运行的函数就是上文的run()函数,每个run()函数中游戏循环中都会对一个game对象进行操作,这个对象就是段首讲的那个“Game类的实例”。当然game运行的过程中此线程要和服务器平台所在的进程或其中的线程进行通信。
开启一个新游戏的过程是:
[code:1]
{
  Game* game=new Game;
  <创建一个新线程: 其中运行的函数=run(); 传给这个函数的参数=game>
}
[/code:1]
2。它将保存这个游戏的全部信息,这样服务器平台才能识别这个游戏。也许还可以在这个类中加入一些统计功能。
ps:忽然又想到另一个模式,原来想的是在线程的外部创建好Game类的实例并进行初始化,然后再传给新线程的处理函数;现在想到其实可以把Game类的实例初始化时需要的数据作为参数传给新线程的处理函数,在函数中创建新的Game类实例并初始化,这样当游戏结束时随着run()函数的结束,Game类的事例也会自动被释放的,剩得再用delete了。
3。可能需要Manage类的实例定期地检查游戏,比如是否运行正常,比如是否有哪个已经结束的游戏的数据或线程资源还没被释放的;发现问题的话就要进行日志的操作和尝试自己解决问题。
每个服务器的模块都要做成一个动态连接库,然后由服务器平台载入。不过不知道C++的类能不能做到库里面。不知道Qt之类的是怎么弄的。反正一个服务器模块也就相当于一个插件吧。

客户端暂时还没想到什么~

wq1977看看撒~
发表于 2004-2-23 10:20:02 | 显示全部楼层

Hi

也许我的书太旧了

谢谢你的帮忙


我会努力的
回复

使用道具 举报

发表于 2004-2-23 20:06:39 | 显示全部楼层
看了  
觉得还有很多东西要设计
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 23:59 , Processed in 0.043272 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表