續(xù)上在上面我簡單的說了一下服務(wù)器完成端口處理部分,接下來我想大家介紹一下關(guān)于如何建立服務(wù)器和客戶端的聯(lián)系規(guī)則,也就是服務(wù)器和客戶端的游戲協(xié)議部分。有不足之處希望大家和我進(jìn)行交流。
首先解釋一下這里協(xié)議的概念,協(xié)議大家都了解是一種通信規(guī)則,例如:TCP/IP,UDP等等,這些是我們在網(wǎng)絡(luò)通信過程中所處理使用的協(xié)議。而我們這里的協(xié)議是我們的游戲服務(wù)器和客戶端的通信規(guī)則。簡而言之,也就是客戶端發(fā)送到服務(wù)器的數(shù)據(jù)包和服務(wù)器發(fā)送的數(shù)據(jù)包雙方解釋規(guī)則。下面就通過幾個部分來具體介紹這種協(xié)議的建立和處理。
消息頭定義
如果我們能夠解釋雙方的數(shù)據(jù)包的意義,我們就必須為雙方數(shù)據(jù)包定義一個統(tǒng)一規(guī)則的消息頭,我是這么定義消息頭的。服務(wù)器數(shù)據(jù)包和客戶端數(shù)據(jù)包分別定義不同的消息頭。以下就是雙方消息頭的簡單定義。
struct ServerMsg_Head //服務(wù)器消息頭
{
WORD s_version; //版本信息
BYTE s_flages; //消息標(biāo)志
BYTE s_who; //消息驅(qū)動者
BYTE s_sort; //消息類別
BYTE s_value; //消息值
WORD s_len; //消息長度
} ;
struct ClientMsg_Head //客戶端消息頭
{
WORD c_version; //版本信息
WORD c_flages //消息標(biāo)志
WORD c_sort; //消息類別
WORD c_value; //消息值
WORD c_scene; //場景信息
WORD c_len; //消息長度
};
以上是我個人簡單定義的消息頭,具體的各個參數(shù)意義,就是需要規(guī)劃設(shè)計的人來定了。這些我就不多說了。
在我們處理完我們的消息頭后,我們就可以將我們的具體游戲數(shù)據(jù)進(jìn)行打包。關(guān)于數(shù)據(jù)打包,我們必須要處理兩件事情:數(shù)據(jù)打包,數(shù)據(jù)加密。為此我就建立相應(yīng)的class來處理這樣的一些操作。DataCtrl.h處理如下:
class Ppackage類可以拆解為兩個單獨處理類,打包類和解包類。而此處我就用下面一個類來進(jìn)行處理。只是給大家開個頭,要設(shè)計的更好還是靠大家共同來進(jìn)行斟酌呀!!
class PPackage //游戲數(shù)據(jù)包處理類
{
public:
PPackage(BYTE msg_type); //設(shè)置所打包消息類型
virtual ~PPackage();
//消息數(shù)據(jù)打包部分
void SetMsgHead(void *); //設(shè)置消息頭
void AddByte(BYTE data); //加入一字節(jié)
void AddWord(WORD data); //加入二字節(jié)
void AddDword(DWORD data); //加入四字節(jié)
void AddPoint(POINT data); //加入八字節(jié)
void AddBuf(char * data ,int data_len); //加入多個字節(jié)
//消息內(nèi)容獲取
void FinishPack(); //完成打包
char *GetPackage(); //獲取數(shù)據(jù)包
int GetPacketLen(); //獲取數(shù)據(jù)包長度
//消息數(shù)據(jù)解包部分
void SetMsgPackage(char *buf,int _Len); //將獲取消息進(jìn)行錄入
void *GetMsgHead(); //獲取消息頭數(shù)據(jù)
BYTE GetByte(); //獲取一字節(jié)
WORD GetWord(); //獲取二字節(jié)
DWORD GetDword(); //獲取三字節(jié)
POINT * GetPoint(); //獲取四字節(jié)
char * GetBuf(int buf_len); //獲取多字節(jié)
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; //后備緩沖區(qū)
int msg_len;
//消息內(nèi)容長度
Server_Msg_Head msg_Head; //消息頭
int buf_Len;
int current_pos; //指針的當(dāng)前位置
protected:
};
以上就是關(guān)于服務(wù)器和消息打包類的一些建立和解釋,這些方面知識其實也沒有什么,主要是“仁者見仁,智者見智”了。而對于網(wǎng)絡(luò)游戲的制作最重要的還是在于Game World的規(guī)劃和設(shè)計,同時這個方面也是最難和最不好處理的。隨后將和大家進(jìn)行探討。。
只有注冊用戶登錄后才能發(fā)表評論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關(guān)文章:
|
||