浅谈网络游戏的设计——服务器端编程(1)

原创 2003年05月13日 17:47:00

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

由于篇幅和时间所限,本文仅能介绍部分知识,主要谈一下如何设计服务器端部分基本模块。另外,阅读本文,需要一定的UNIX编程基础。

       本游戏服务器端操作系统采用UNIX,因为UNIX是标准的服务器操作系统,可保证网络游戏的稳定性。因此,以下所有的编程都将针对UNIX进行。

       服务器端的整体构架如下:通讯模块,消息传递模块,游戏规则模块,线程管理模块,游戏世界管理模块。

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

      

通讯模块:

 

通讯模块主要实现与客户端的通讯功能,实际上,通讯模块就是对套结字Socket的封装。SocketUNIX下的网络通讯基础,对于一个Socket我们可以对其进行读写操作,读入的数据来自客户端,写入的数据可供客户端读取。

Socket主要有阻塞套接字和无阻塞套接字两种,对于无阻塞套结字,每次读写后,不管读写的字节数是否达到要求,都立即返回;而对于阻塞套结字,若读写字节数不够,函数将被阻塞,直到所有待处理的数据都处理完毕才返回。可以看出,若采用无阻塞套结字,则将使网络传输变得很不稳定,在网络环境不好时很难控制传输。因此,对于我们的系统,将采用阻塞模式。

我们下一个面临的问题是怎么知道何时读入,如果在不合适的时候从阻塞套接字读入数据,那线程很可能将被阻塞,这里采用了select——多路复用技术,原理是对我们的socket进行监视,如果socket上有读事件发生,将调用消息模块发送消息给socket的携带对象,对其进行读写。

以下是对Socket的简单封装:

class SSocket

{

    fd_set *SockSet;                           //fd_set,也就是我们的select监听集合

    char IsListenSocket;           //是否是监听套接字

    int ServerPort;                    //监听套接字的监听端口号

    struct sockaddr_in addr;    //地址信息

 

  public:

    SSocket();

    ~SSocket();

   

    int Socket;                          //socket

    int CreateListenSocket(fd_set *sset, int Port, char* addr); //初始//化一个监听socket

    int AcceptSocket(int listen_fd, fd_set *sset);    //初始化一个非监听socket

    int CloseSocket();                                           //关闭 socket

 

    int SendBuf(void *buf, int size);         //发送数据

    int RecvBuf(void *buf, int size);   //接收数据

   

    int SetSocketFd();                                           //socket加入到监听集合中

    int ClrSocketFd();                                           //socket从监听集合中清除

 

};

通过对socket的封装,我们完成了通讯模块的基本任务。下一步要做的是传输网络上的消息,此时需要对SSocket继续封装,首先定义一个消息结构体,然后就是读写消息,消息结构根据各个游戏不同,在此就不再深入探讨了。

 

 

 

线程管理模块

 

由于我们用了阻塞模式,这就意味着必须要为各个socket创建单独的线程,否则很可能会引起服务器端停止工作。因此我们需要封装线程,封装内容主要包括:线程函数地址,线程开始时间,线程上次阻塞时间,线程最大阻塞时间,线程start方法,线程stop方法。线程stop方法可以通过发送信号给线程来达到杀死线程的目的。

线程类封装完成后,我们就可以开始编写管理模块代码了。管理模块其实也是一个线程,其第一功能就是监视各个线程是否阻塞超时,通过察看线程上次阻塞时间和最大阻塞时间来完成。一旦发现当前时间超过线程最大阻塞时间加上线程上次阻塞时间,既可断定线程阻塞超时,此时就需要kill该线程。另外,其他一些根线程有关的管理方法都有此模块负责。

 

 

消息传递模块:

 

对象、模块之间怎样传递消息,这也是服务器端设计的重点。举一个简化的例子说明如下:若某一玩家对另一玩家发了一条信息,先通过通讯模块接收数据,然后用消息传递模块通知另一玩家,再由另一玩家的线程调用通讯模块把消息发回客户端,这就是消息传递模块的作用。

要怎样封装消息模块呢?第一步就是做一个MessageBox类,它是一个堆栈,用来装消息,主要由poppush方法,当然这里不能忘了必须实现一个存储消息数据结构。第二步封装就是HandleMessage类,这就是我们的消息模块的主要实现。其中有一个WaitMessage方法,调用此方法后,线程将被阻塞,直到有消息到达。在此可通过无名信号量来实现,也就是UNIX下的sem,它可以增加或减少信号量来实现互斥。然而,有人一定会问,为什么我们要有WaitMesssage呢,这不是将造成线程阻塞吗?其实,服务器端是一个被动驱动的模型,就像没有踩油门汽车就不会走一样,如果没有消息来驱动,服务器端就不会运行下去。

实现以上封装后,在两个对象之间发消息就变得很简单,我们直接用SendMessage方法就可以,SendMessage的实现也很简单,就是调用MessageBoxPush方法向里边放消息,之后把sem加一,这样接受这就可以收到消息了。

 

 

其他:

 

剩下的两个模块,都是与游戏相关的,事实上他们是两个更为复杂的模块,根据要编写的游戏的不同,这两个模块实现也不同。但是,他们究竟是做什么的,下面通过一个例子来说明:

假设我们现在开发的是一个RPG游戏,我们的玩家在屏幕上让游戏人物向前走了一步,此时发送移动请求给服务器端,服务器端的通讯模块收到后,便通知游戏世界管理模块,游戏世界管理模块调用游戏规则模块,判断玩家请求是否符合规则(是否合法),若可以移动,再由游戏管理模块将其坐标改变,最后再通知其相关玩家。也就是说,规则模块实际上是专门处理游戏业务逻辑的,管理模块实际上是专门处理游戏对象的。

 

 

小结

              网络游戏的开发入门是挺难的,实际上,本文只能起到抛砖引玉的作用,仅告诉大家一个入门的方法而已,剩下的,还有那烦人的一行一行实现代码。

 

非常希望对网络游戏设计感兴趣的与我交流

sunxing@cosco-logistics-km.com.cn

浅谈网络游戏的设计——服务器端编程

由于篇幅和时间所限,本文仅能介绍部分知识,主要谈一下如何设计服务器端部分基本模块。另外,阅读本文,需要一定的UNIX编程基础。   本游戏服务器端操作系统采用UNIX,因为UNIX是标准的服务器操作系...
  • blacksource
  • blacksource
  • 2009年02月17日 20:09
  • 881

浅谈网络游戏的设计--服务器端编程

不错的系列文章,源地址:http://blog.csdn.net/sunxking/article/details/12968 原作者:shaklL 浅谈网络游戏的设计 ——服务器端...
  • everimbaq
  • everimbaq
  • 2015年03月27日 16:32
  • 306

浅谈网络游戏的设计——服务器端编程 (2)

浅谈网络游戏的设计——服务器端编程 (2)  关键词:UNIX,Socket,通讯模块,线程管理模块,消息传递模块,游戏规则模块,游戏世界管理模块 非常感谢大家对上一篇文章的支持,在大家的支持下,我决...
  • sunxking
  • sunxking
  • 2003年05月18日 11:01
  • 2026

浅谈网络游戏的设计——服务器端编程(3)

下面我们看几个例子。   首先是经典游戏《DIABLO 2》,要研究一个游戏的竞争系统,第一步要做的就是看玩家玩这个游戏大部分的时间是花在什么上面,答案是:找装备;其次再看看在这个游戏里什么样的角色是...
  • q3745960
  • q3745960
  • 2010年05月19日 10:51
  • 442

浅谈网络游戏的设计——服务器端编程(2)

非常感谢大家对上一篇文章的支持,在大家的支持下,我决定推出浅谈网络游戏开发(2)这篇文章。 首先,再次强调一下,网络游戏开发极为困难,技术含量相当的高,其编程知识涉及网络编程,操作系统进程、线程编程,...
  • q3745960
  • q3745960
  • 2010年05月19日 10:48
  • 439

浅谈网络游戏的设计--——服务器端编程(3)

浅谈网络游戏的设计——服务器端编程 (3)  关键词: 网络游戏 构思 策划 创意 竞争机制 竞争系统 本系列文章始终以浅谈二字开头,所以内容简单,不够深入,希望大家谅解。但是,正如人类的学习过程一样...
  • sunxking
  • sunxking
  • 2003年05月22日 08:31
  • 1942

网络游戏外挂制作技术浅谈

网络游戏外挂制作技术浅谈2007-01-27 21:05外挂无非分以下几种(依制作难度):1、动作式,所谓动作式,就是指用API发命令给窗口或API控制鼠标、键盘等,使游戏里的人物进行流动或者攻击,最...
  • shaozhanyu
  • shaozhanyu
  • 2013年10月23日 16:27
  • 533

原创《终极网络服务端编程》pdf+配套源码

历时3个多月,本人编写出《终极网络服务端编程》pdf电子书+配套源码。   本书 《终极网络服务端编程》 主要围绕网络服务端编程技术,编程语言使用c/c++ ,lua,从基础的网络通讯知识讲解,到实...
  • smwhotjay
  • smwhotjay
  • 2016年01月03日 18:12
  • 1601

浅谈游戏服务器端编程(1)

本游戏服务器端操作系统采用UNIX,因为UNIX是标准的服务器操作系统,可保证网络游戏的稳定性。因此,以下所有的编程都将针对UNIX进行。   服务器端的整体构架如下:通讯模块,消息传递模块,游戏规...
  • u011686361
  • u011686361
  • 2015年09月10日 15:28
  • 558

游戏粘性(DavidPerry游戏设计白皮书)

Addiction 游戏粘性 Rarely will you find a game which can be replayed over and over because of its ga...
  • huodianyan
  • huodianyan
  • 2014年07月24日 14:41
  • 272
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈网络游戏的设计——服务器端编程(1)
举报原因:
原因补充:

(最多只允许输入30个字)