很多人都喜欢使用境界,来划分层次。王国维的人生三境界,玄幻小说中的内功三境界。网上有一篇《网络协议的三境界》,但作者只是蜻蜓点水一样,让人意犹未尽。
按照三境界的层次,我对第二层作一个实现。
对于网络TCP或UDP流来说,在send和recv操作,不管上层是怎样一个结构、对象,最终都要序列化为流,char*流或byte流,或从流中反序列化回来。
按照DRY原则,我们在调用send之前,必须进行序列化。
按照OO原则,我们定义一个基类:Message
class Message
{
public:
int Serialize(LPVOID lpBuffer, int cbBuffer) = 0;
int Deserialize(LPVOID lpBuffer, int cbBuffer) = 0;
int GetLength() = 0;
}
拿登陆消息,
class Login : public Message
{
public:
int Serialize(LPVOID lpBuffer, int cbBuffer)
{
int len;
len = strName.size();
memcpy(lpBuffer, &len, sizeof(UINT32));
memcpy(lpBuffer, &strName.c_str, len);
}
int Deserialize(LPVOID lpBuffer, int cbBuffer);
int GetLength()
{
int len = 0;
len = sizeof(UINT32) + strName.size() + sizeof(UINT32) + strPassword.size();
return len;
}
public:
// 登陆数据
std::string strName;
std::string strPassword;
}
网络模块,在发送或接收时,就可以直接调用Serialize()和DeSerialize()来进行数据的序列化和反序列化,而不需要知道协议的具体细节。