happy-ip开发udp server样例(protobuf版)

主函数代码如下

#include <ip/server/udp_server.h>
#include "proto_server_message_factory.h"
#ifdef GLOG_OUTPUT
#include <config_glog.h>
#endif
using namespace happy::asio::ip;

int main(int argc, char* argv[])
{
    // 默认创建线程池的大小为4。
    //IoServicePool::singleton::Create(4); 
#ifdef GLOG_OUTPUT
    happy::utils::ConfigGlog(argv[0]);
#endif
    uint16_t port = 1235;
    UdpServer udp_server(port);
    printf("udp server is run (port=%d)\n", port);
    udp_server.SetMessageFactory(make_shared <ProtoServerMessageFactory>("", true));
    IoServicePool::singleton::GetInstance()->Run();

    return EXIT_SUCCESS;
}

        主函数中只需要实例化UdpServer类,设置UdpServer类的MessageFactory。IoServicePool如果没有调用create函数, 默认创建线程池的大小为4。一定记得在最后调用IoServicePool类的run函数,启动io线程池。ProtoServerMessageFactory类构造函数提供了is_read_print参数,设置为true代表网络层自动打印收到的protobuf消息。默认打印消息到终端窗口,如果定义了GLOG_OUTPUT宏,日志就会通过glog方式输出。使用glog方式输出日志,需在使用前调用ConfigGlog函数。

ProtoServerMessageFactory.h代码如下

#pragma once
#include <network/server_message_factory.h>
#include <utils.h>
using namespace happy::utils::network;

class ProtoServerMessageFactory : public ServerMessageFactory
{
    CREATE_PROTO(ProtoServerMessageFactory);
public:
    ProtoServerMessageFactory(const string& session_id, const bool is_read_print);
private:
    shared_ptr <Message> RequestInfoHandler(const shared_ptr<Message> message);
};

        继承于ServerMessageFactory类,需要实现Create虚函数,Create函数是作为创建实例的工厂类调用。定义处理各种protobuf消息的函数,此出为RequestInfoHandler函数,专门处理RequestInfo消息。

ProtoServerMessageFactory.cpp代码如下

#include "proto_server_message_factory.h"
#include "dmo.pb.h"

ProtoServerMessageFactory::ProtoServerMessageFactory(const string& session_id, const bool is_read_print)
    : ServerMessageFactory(session_id, is_read_print)
{
    handler_[RequestInfo::descriptor()->full_name()] = std::bind(&ProtoServerMessageFactory::RequestInfoHandler, this, std::placeholders::_1);
}

shared_ptr <Message> ProtoServerMessageFactory::RequestInfoHandler(const shared_ptr<Message> message)
{
    //auto request_info = dynamic_pointer_cast <RequestInfo>(message);
    auto response = make_shared <ResponseInfo>();
    response->set_info("server response data");

    return response;
}

       构造函数中动态绑定protobuf消息的RPC函数。RPC函数RequestInfoHandler将收到RequestInfo消息,通过动态转换即可使用。由于ServerMessageFactory类默认已设置应答消息给客户端,所以RequestInfoHandler函数必须返回response消息。

运行结果如下(打开了GLOG_OUTPUT开关)

udp server is run (port=1235)
I1008 20:48:09.031095  9728 util_message_factory.cpp:19] receive message: happy.utils.network.RequestInfo
I1008 20:48:09.510646  9728 util_message_factory.cpp:22] info: "324234"
I1008 20:48:09.510646  9728 util_message_factory.cpp:77] Send response: happy.utils.network.ResponseInfo
I1008 20:48:11.651698  9728 util_message_factory.cpp:19] receive message: happy.utils.network.RequestInfo
I1008 20:48:11.651698  9728 util_message_factory.cpp:22] info: "333"
I1008 20:48:11.651698  9728 util_message_factory.cpp:77] Send response: happy.utils.network.ResponseInfo

        绑定端口为1235,收到客户端2条protobuf信息。每条消息占三行输出,第1行表示收到客户端的protobuf消息全称,第2行表示消息的具体内容,第3行表示应答客户端的消息。是不是很简单,欢迎大家使用。

资源下载

      git地址为:https://github.com/wangziwen333/happy-ip

      happy-ip使用的第三方库和头文件:https://download.csdn.net/download/wang19840301/10698515

windows编译参数

cmake .. -LA -DBOOST_INCLUDE_DIR='E:\git\3rdparty\include' -DBOOST_LIB_DIR='E:\git\3rdparty\lib\win32_debug' -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS_DEBUG="/MTd /Zi /Ob0 /Od /RTC1" -DBUILD_EXAMPLES=ON -DBUILD_NETWORK=ON -DGLOG_OUTPUT=ON

linux编译参数

cmake .. -LA -DBOOST_INCLUDE_DIR='/mnt/e/git/3rdparty/include' -DBOOST_LIB_DIR='/mnt/e/git/3rdparty/lib/linux_debug' -DCMAKE_BUILD_TYPE=Debug -DBUILD_EXAMPLES=ON -DBUILD_EXAMPLES=ON -DBUILD_NETWORK=ON -DGLOG_OUTPUT=ON

猜你喜欢

转载自blog.csdn.net/wang19840301/article/details/82973451