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



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

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


通讯模块:

  通讯模块主要实现和客户端通讯功能实际上通讯模块就是对套结字Socket封装SocketUNIX网络通讯基础对于Socket我们可以对其进行读写操作读入数据来自客户端写入数据可供客户端读取
  Socket主要有阻塞套接字和无阻塞套接字两种对于无阻塞套结字每次读写后不管读写字节数是否达到要求都立即返回;而对于阻塞套结字若读写字节数不够将被阻塞直到所有待处理数据都处理完毕才返回可以看出若采用无阻塞套结字则将使网络传输变得很不稳定在网络环境不好时很难控制传输因此对于我们系统将采用阻塞模式
  我们下个面临问题是如何知道何时读入如果在不合适时候从阻塞套接字读入数据那线程很可能将被阻塞这里采用了
select——多路复用技术原理是对我们进行监视如果上有读事件发生消息模块发送消息给携带对象对其进行读写

以下是对Socket简单封装:

SSocket

{

fd_ *SockSet; //fd_也就是我们select监听集合

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

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

struct sockaddr_in addr; //地址信息



public:

SSocket;

~SSocket;





Socket; //

CreateListenSocket(fd_ *s, Port, char* addr); ////个监听

AcceptSocket( listen_fd, fd_ *s); //个非监听

CloseSocket; //关闭



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

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



SetSocketFd; //加入到监听集合中

ClrSocketFd; //从监听集合中清除



};

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


 

线程管理模块:



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

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







消息传递模块:



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

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

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





其他:



剩下两个模块都是和游戏相关事实上他们是两个更为复杂模块根据要编写游戏区别这两个模块实现也区别但是他们究竟是做什么下面通过个例子来介绍说明:

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





小结

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





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

[email protected]



Tags:  数据库服务器编程 服务器编程 网络游戏服务器端 网络游戏服务器编程

延伸阅读

最新评论

发表评论