编写自己的消息结构
以下是我编写的一个简单的消息结构
#ifndef MESSAGE_H #define MESSAGE_H #include <string> //serialization #include <boost/archive/text_oarchive.hpp> //deserialization #include <boost/archive/text_iarchive.hpp> using std::string; //message type enum MessageOption { Login, Logout, SendToAll, PrivateChat }; struct Message { friend class boost::serialization::access; //use this function to serialize and deserialize object template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & sender & receiver & message & option; } string sender; string receiver; string message; MessageOption option; }; #endif
注意编写class或者struct时要编写serialize函数
接下来是序列化与反序列化的方法
#ifndef SERIALIZE_H #define SERIALIZE_H #include <string> #include "Message.h" class Serialization { public: static std::string Serialize(const Message& msg); static Message DeSerialize(const std::string& message); }; #endif
#include "Serialization.h" #include <sstream> std::string Serialization::Serialize(const Message& msg) { std::ostringstream archiveStream; boost::archive::text_oarchive archive(archiveStream); archive<<msg; return archiveStream.str(); } Message Serialization::DeSerialize(const std::string& message) { Message msg; std::istringstream archiveStream(message); boost::archive::text_iarchive archive(archiveStream); archive>>msg; return msg; }
(三)处理消息
刚才编写的那个消息结构里面有个option,通过这个option我们就可以知道这个对方发过来的消息是要干嘛的
以下是服务器处理客户端消息的函数
template<typename T> void EpollServerSocket<T>::ProcessMessage(Socket& clientSocket) { std::string message; ReceiveMessage(clientSocket,message); T msgStruct=Serialization::DeSerialize(message); switch(msgStruct.option) { case Login : SendMessage(clientSocket,"Login_Success"); break; case Logout: SendMessage(clientSocket,"Logout_Success"); DeleteClient(clientSocket.GetSocketfd()); break; case SendToAll: SendToAllUsers(msgStruct.message); break;
//messages of other type……
default: break;
} }