首先更改src的CMakeLists.txt的内容为:
#当前目录的所有源文件放入SRC_LIST
aux_source_directory(. SRC_LIST)
#生成SHARED动态库
#add_library(mprpc SHARED ${SRC_LIST})
#由于muduo是静态库,为了使用muduo,将mprpc也生成为静态库
add_library(mprpc ${SRC_LIST})
#链接库
target_link_libraries(mprpc muduo_net muduo_base pthread)
rpcprovider.h
#pragma once
#include "google/protobuf/service.h"
#include <memory>
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/TcpConnection.h>
//框架提供的专门发布rpc服务的网络对象类
class RpcProvider
{
public:
//这里是框架提供给外部使用的,可以发布rpc方法的函数接口
void NotifyService(google::protobuf::Service* service);//具体的服务对象类是从Service类继承而来
//框架是可以接收各种RPC服务的,不能依赖具体的某一个业务。
//基类指针指向子对象
//启动rpc服务节点,开始提供rpc远程网络调用服务
void Run();
private:
//组合EventLoop
muduo::net::EventLoop m_eventLoop;
//新的socket连接回调
void OnConnection(const muduo::net::TcpConnectionPtr&);
//已建立连接用户的读写事件回调
void OnMessage(const muduo::net::TcpConnectionPtr&,muduo::net::Buffer*,muduo::Timestamp);
};
rpcprovider.cc
#include "rpcprovider.h"
#include "mprpcapplication.h"
#include <string>
#include <functional>
//这里是框架提供给外部使用的,可以发布rpc方法的函数接口
void RpcProvider::NotifyService(google::protobuf::Service *service)
{
}
// 启动rpc服务节点,开始提供rpc远程网络调用服务
void RpcProvider::Run()
{
std::string ip=MprpcApplication::GetInstance().GetConfig().Load("rpcserverip");
uint16_t port=atoi(MprpcApplication::GetInstance().GetConfig().Load("rpcserverport").c_str());
muduo::net::InetAddress address(ip,port);
//创建TcpServer对象
muduo::net::TcpServer server(&m_eventLoop,address,"RpcProvider");
//绑定连接回调和消息读写回调方法 ,muduo库的好处是:分离了网络代码和业务代码
server.setConnectionCallback(std::bind(&RpcProvider::OnConnection, this, std::placeholders::_1));//预留1个参数std::placeholders::_1
server.setMessageCallback(std::bind(&RpcProvider::OnMessage, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_3));//预留3个参数std::placeholders::_1,2,3
//设置muduo库的线程数量
server.setThreadNum(4);
std::cout<<"RpcProvider start service at ip:"<<ip<<"port:"<<port<<std::endl;
//启动网络服务
server.start();
m_eventLoop.loop();
}
//新的socket连接回调
void RpcProvider::OnConnection(const muduo::net::TcpConnectionPtr&)
{
}
// 已建立连接用户的读写事件回调
void RpcProvider::OnMessage(const muduo::net::TcpConnectionPtr&,muduo::net::Buffer*,muduo::Timestamp)
{
}
编译:
执行: