消息处理器类

用于消息的生成、发送、接收处理和打印。

 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 }

 

posted @ 2017-10-09 15:23  lausaa  阅读(213)  评论(0)    收藏  举报