Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1016515
  • 博文数量: 128
  • 博客积分: 10012
  • 博客等级: 上将
  • 技术积分: 2050
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 17:49
文章分类

全部博文(128)

文章存档

2011年(16)

2009年(57)

2008年(55)

分类:

2011-02-27 11:20:09

续上在上面我简单的说了一下服务器完成端口处理部分,接下来我想大家介绍一下关于如何建立服务器和客户端的联系规则,也就是服务器和客户端的游戏协议部分。有不足之处希望大家和我进行交流。

  首先解释一下这里协议的概念,协议大家都了解是一种通信规则,例如:TCP/IP,UDP等等,这些是我们在网络通信过程中所处理使用的协议。而我们 这里的协议是我们的游戏服务器和客户端的通信规则。简而言之,也就是客户端发送到服务器的数据包和服务器发送的数据包双方解释规则。下面就通过几个部分来 具体介绍这种协议的建立和处理。

消息头定义

  如果我们能够解释双方的数据包的意义,我们就必须为双方数据包定义一个统一规则的消息头,我是这么定义消息头的。服务器数据包和客户端数据包分别定义不同的消息头。以下就是双方消息头的简单定义。

struct ServerMsg_Head //服务器消息头
{
    WORD s_version; //版本信息
    BYTE s_flages; //消息标志
    BYTE s_who; //消息驱动者
    BYTE s_sort; //消息类别
    BYTE s_value; //消息值
    WORD s_len; //消息长度
} ;

struct ClientMsg_Head //客户端消息头
{
    WORD c_version; //版本信息
    WORD c_flages //消息标志
    WORD c_sort; //消息类别
    WORD c_value; //消息值
    WORD c_scene; //场景信息
    WORD c_len; //消息长度
};

以上是我个人简单定义的消息头,具体的各个参数意义,就是需要规划设计的人来定了。这些我就不多说了。

  在我们处理完我们的消息头后,我们就可以将我们的具体游戏数据进行打包。关于数据打包,我们必须要处理两件事情:数据打包,数据加密。为此我就建立相应的class来处理这样的一些操作。DataCtrl.h处理如下:

class Ppackage类可以拆解为两个单独处理类,打包类和解包类。而此处我就用下面一个类来进行处理。只是给大家开个头,要设计的更好还是靠大家共同来进行斟酌呀!!


class PPackage //游戏数据包处理类
{
public:
    PPackage(BYTE msg_type); //设置所打包消息类型
    virtual ~PPackage();
    //消息数据打包部分
    void SetMsgHead(void *); //设置消息头
    void AddByte(BYTE data); //加入一字节
    void AddWord(WORD data); //加入二字节
    void AddDword(DWORD data); //加入四字节
    void AddPoint(POINT data); //加入八字节
    void AddBuf(char * data ,int data_len); //加入多个字节
    //消息内容获取
    void FinishPack(); //完成打包
    char *GetPackage(); //获取数据包
    int GetPacketLen(); //获取数据包长度


    //消息数据解包部分
    void SetMsgPackage(char *buf,int _Len); //将获取消息进行录入
    void *GetMsgHead(); //获取消息头数据
    BYTE GetByte(); //获取一字节
    WORD GetWord(); //获取二字节
    DWORD GetDword(); //获取三字节
    POINT * GetPoint(); //获取四字节
    char * GetBuf(int buf_len); //获取多字节
    bool IfFinishGet(); //是否完成解包

private:

    void Init();
    void Release();
    void StartBindPakage(); //开始打包
    void StartUndoPackage(); //开始解包
    bool MessageEncrypt(); //消息加密
    bool MessageUndo(); //消息解密

private:

private:
    BYTE msg_type; / /{1-SERVER_PACKAGE=1,2-CLIENT_PACKAGE=2}
    char * msg_buffer;
    char * buffer; //后备缓冲区
    int msg_len;
    //消息内容长度
    Server_Msg_Head msg_Head; //消息头
    int buf_Len;
    int current_pos; //指针的当前位置
protected:
};

  以上就是关于服务器和消息打包类的一些建立和解释,这些方面知识其实也没有什么,主要是“仁者见仁,智者见智”了。而对于网络游戏的制作最重要的还是在于Game World的规划和设计,同时这个方面也是最难和最不好处理的。随后将和大家进行探讨。。
阅读(1750) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~