简陋RPC理解实现

详情见注解

#include <iostream>
#include <list>
#include <map>
#include <cstring>
#include <iostream>
#include <memory>
#include <functional>

#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>

/*
 * Async Server
 */

using namespace boost::asio;
typedef std::shared_ptr<ip::tcp::socket> socket_ptr;

bool main_loop = true;

io_service ioserver;
ip::tcp::endpoint ep { ip::tcp::v4(), 2021};
ip::tcp::acceptor accer {ioserver, ep};

class IgnoreException:public std::exception {
public:
};


// 父类提供接口
class AbsHandler{
public:
	virtual const std::string execute(){
	}
	virtual void operator()(){
	}
};

class SendHandleMsg:public AbsHandler {
public:
		virtual const std::string execute() override{
			return "MMMMM";
		}
};


class SendCutMsg:public AbsHandler{
public:
	virtual const std::string execute() override {
		return "wo co ni daye";
	}
};

class QuitCmd:public AbsHandler{
public:
	virtual const std::string execute() override {
		throw boost::system::error_code();
	}
};

//初始化调用对象,可能会有更复杂的调用机制需要另外设计。
class Controler{
public:
	Controler(){
		//初始化命令以及对象,也可以用XML等文本生成或重新配置。
		handler["callme"] = std::make_shared<SendHandleMsg>();
		handler["funcme"] = std::make_shared<SendCutMsg>();
		handler["quit"] = std::make_shared<QuitCmd>();
	}

	std::shared_ptr<AbsHandler> rpc(const std::string sz){
		if( handler.find(sz) == handler.cend()){
			throw IgnoreException();
		}
		return handler[sz];
		}

private:
	std::map<std::string,std::shared_ptr<AbsHandler>> handler;

};


void handleConnection(socket_ptr, const boost::system::error_code&);
void startAAccept(socket_ptr);

void startAAccept(socket_ptr sok)
{
	accer.async_accept(*sok,boost::bind(handleConnection, sok, boost::placeholders::_1));
}



void handleConnection(socket_ptr sok, const boost::system::error_code& err)
{
	if(err) return;
	char buff[1024];
	bool cont = true;
	while(cont){
	try{
		sok->read_some(buffer(buff));
		std::string cmd (buff);
		std::cout << "Received .. \n" << cmd << std::endl;
		Controler ctrl;
		// 调用的逻辑
		sok->write_some(buffer(ctrl.rpc(cmd)->execute()));
		std::memset(buff,0,sizeof(buff));
	} catch( boost::system::error_code& err){
		cont = false;
	} catch (IgnoreException& e){
		sok->write_some(buffer("Error cmd."));
		std::memset(buff,0,sizeof(buff));

		}
	}
	std::cout << "Disconection." << std::endl;
	socket_ptr nsok (new ip::tcp::socket(ioserver));
	startAAccept(nsok);
}

int main(int argc, char* argv[])
{
	socket_ptr sok (new ip::tcp::socket(ioserver));
	startAAccept(sok);
	ioserver.run();
}
上一篇:codeblock 编译 SmartWin++项目 vc2010编译器 void __cdecl boost::throw_exception解决记录


下一篇:状态机