消息处理器类
用于消息的生成、发送、接收处理和打印。
1 #ifndef __message_handler_h_ 2 #define __message_handler_h_ 3 4 #include "cooper_server.h" 5 #include "cooper_client.h" 6 7 //---------------------------------------------------------------------- 8 9 class MessageHandler 10 { 11 public: 12 MessageHandler(); 13 ~MessageHandler(); 14 static MessageHandler* get_instance(); 15 16 msg_ptr GenerateMsg(const string& dst_ip, uint type, const char* buf, uint buf_length); 18 bool SendMsg(msg_ptr msg); 19 void RecvMsg(const CooperMessage& msg); 20 void PrintMsg(const CooperMessage& msg); 21 22 private: 23 void RecvMsgThreadEntry(); 25 void SendMsgThreadEntry(msg_ptr msg); 26 27 public: 28 static MessageHandler* instance_; 29 boost::asio::io_service server_io_service_; 30 CooperServer* msg_server_; 31 }; 32 33 #endif // __message_handler_h_
1 #include "message_handler.h" 2 3 MessageHandler* MessageHandler::instance_ = NULL; 4 5 MessageHandler* MessageHandler::get_instance() 6 { 7 if (instance_ == NULL) 8 instance_ = new MessageHandler(); 9 10 return instance_; 11 } 12 13 MessageHandler::MessageHandler() : msg_server_(NULL) 14 { 15 boost::thread recvmsg_thread( 16 boost::bind(&MessageHandler::RecvMsgThreadEntry, this)); 17 recvmsg_thread.detach(); 18 } 19 20 MessageHandler::~MessageHandler() 21 { 22 server_io_service_.stop(); 23 24 if (msg_server_ != NULL) 25 delete msg_server_; 26 } 27 28 msg_ptr MessageHandler::GenerateMsg(const string& dst_ip, 29 uint type, const char* buf, uint buf_length) 30 { 31 msg_ptr new_msg(new CooperMessage(dst_ip, type, buf, buf_length)); 32 return new_msg; 33 } 34 35 bool MessageHandler::SendMsg(msg_ptr msg) 36 { 37 if (msg->get_data() == NULL) 38 return false; 39 40 try { 41 boost::thread sendmsg_thread( 42 boost::bind(&MessageHandler::SendMsgThreadEntry, this, msg)); 43 sendmsg_thread.join(); 44 } catch (std::exception& e) { 45 std::cerr << "Client thread Exception: " << e.what() << "\n"; 46 } 47 48 return true; 49 } 50 51 void MessageHandler::SendMsgThreadEntry(msg_ptr msg) 52 { 53 try { 54 boost::asio::io_service io_service; 55 tcp::resolver resolver(io_service); 56 tcp::resolver::query query(msg->get_dst_ip(), kServerPort); 57 tcp::resolver::iterator iterator = resolver.resolve(query); 58 59 CooperClient new_client(io_service, iterator); 60 new_client.AsyncWrite(msg); 61 io_service.run(); 62 printf("Send msg to %s done!\n", msg->get_dst_ip()); 63 } catch (std::exception& e) { 64 std::cerr << "Client Exception: " << e.what() << "\n"; 65 } 66 } 67 68 void MessageHandler::RecvMsg(const CooperMessage& msg) 69 { 70 PrintMsg(msg); 71 } 72 73 void MessageHandler::RecvMsgThreadEntry() 74 { 75 try { 76 tcp::endpoint endpoint( 77 boost::asio::ip::address::from_string(CooperCommon::get_instance()->local_ip_), 78 atoi(kServerPort)); 79 msg_server_ = new CooperServer(server_io_service_, 80 endpoint, 81 bind(&MessageHandler::RecvMsg, this, _1)); 82 printf("server_io_service_ run\n"); 83 server_io_service_.run(); 84 printf("server_io_service_ stop, server thread end\n"); 85 } catch (std::exception& e) { 86 std::cerr << "Server Exception: " << e.what() << "\n"; 87 } 88 } 89 90 void MessageHandler::PrintMsg(const CooperMessage& msg) 91 { 92 printf("data_length: %d\n", msg.get_data_length()); 93 printf("src_ip: %s\n", msg.get_src_ip()); 94 printf("dst_ip: %s\n", msg.get_dst_ip()); 95 printf("msg_type: %u\n", msg.get_type()); 96 printf("timestamp_sec: %u\n", msg.get_timestamp_second()); 97 printf("timestamp_msec: %llu\n", msg.get_timestamp_microsec()); 98 printf("body_length: %u\n", msg.get_body_length()); 99 printf("body_crc32: %llu\n", msg.get_body_crc32()); 100 printf("body: %s\n", msg.get_body()); 101 }
测试代码:
1 #include "message_handler.h" 2 3 int main(int argc, char **argv) 4 { 5 CooperCommon* pcommon = CooperCommon::get_instance(); 6 pcommon->set_local_ip(argv[1]); 7 MessageHandler* pmsg_handler = MessageHandler::get_instance(); 8 9 char line[100]; 10 11 while (cin.getline(line, 100)) { 12 if (strcmp(line, "exit") == 0) { 13 break; 14 } 15 16 msg_ptr msg = pmsg_handler->GenerateMsg("10.10.161.33", 1001, line, strlen(line)); 17 pmsg_handler->SendMsg(msg); 18 } 19 20 delete pmsg_handler; 21 delete pcommon; 22 return 0; 23 }