跨平台高性能TCP服务器框架 &boost

   王子原创作品。转载请注明出处http://blog.csdn.net/wang19840301

  基于boost的asio封装的高性能TCP服务器。asio已经有很好的事件封装机制,只有底层事件,没有针对TCP建立会话机制;也没有多包进行合包,以包为单位的事件提交机制。由于以上多种原因,决定对boost库进行更高的抽象和封装,对开发者提供一种更为便利的使用接口。

       本代码实现了一下主要功能:

1.、为每个TCP客户端建立session,每个session创建事件,向应用开发则投递事件。

事件主要有3类:

(1)会话创建

(2)接收数据

(3)会话结束

2、为每个会话创建超时和跟踪机制,提供在移动通信IP变化情况下的设备上下线判断。

3、运用最新的C++11语法规范实现全部代码(lamda override bind)


主函数调用实例:

#include "stdafx.h"
#include <Ip/Server/TcpServer.h>
#include "ClientMessageFactory.h"
#include <memory>
#include <Singleton.h>
#include "MyTcpServer.h"
using namespace klicen::asio::ip;
using namespace std;
using namespace klicen::utils;


void main(int argc, char* argv[])
{
TcpServer tcp_server(10001);
tcp_server.SetMessageFactory(shared_ptr <MessageFactory>(new ClientMessageFactory));
MyTcpServer my_tcp_server(10002);


IoServicePool::singleton::GetInstance()->Run();
}


一、提供两种调用方法:

1、原始TcpServer类,调用SetMessageFactory绑定事件;

TcpServer tcp_server(10001);
tcp_server.SetMessageFactory(shared_ptr <MessageFactory>(new ClientMessageFactory));

2、继承TcpServer类,重写GetMessageFactory方法;

MyTcpServer my_tcp_server(10002);


二、ClientMessageFactory类说明

1. 头文件代码

#pragma once
#include <Ip/MessageFactory.h>


class ClientMessageFactory : public klicen::asio::ip::MessageFactory
{
public:
ClientMessageFactory(const string& session_id = "");
virtual shared_ptr <klicen::asio::ip::MessageFactory> Create(const string& session_id) override;
virtual void HandleCreate(string& response) override;
virtual bool HandleRead(const uint8_t* buffer, const size_t& length, size_t& deal_length, string& response) override;
virtual void HandleClose() override;
};

备注:当用第一种方法调用TcpServer时,需要实现如下接口

virtual shared_ptr <klicen::asio::ip::MessageFactory> Create(const string& session_id) override


2、源文件代码

#include "ClientMessageFactory.h"


void ClientMessageFactory::HandleCreate(string& response)
{
printf("Session is create: %s\n", session_id_.c_str());
}


bool ClientMessageFactory::HandleRead(const uint8_t* buffer, const size_t& length, size_t& deal_length, string& response)
{
deal_length = length;
string str;
str.append(reinterpret_cast <char *>(const_cast <uint8_t *>(buffer)), length);
printf("Receive data: %s\n", str.c_str());


// true: if deal_length == length, then single package; else multiple package. next length = length - deal_length
// false: if deal_length == length, then has subsequent package, next length = length + receive length
return true;
}


void ClientMessageFactory::HandleClose()
{
// Time out close
}


shared_ptr <klicen::asio::ip::MessageFactory> ClientMessageFactory::Create(const string& session_id)
{
return make_shared <ClientMessageFactory>(session_id);
}


ClientMessageFactory::ClientMessageFactory(const string& session_id)
: klicen::asio::ip::MessageFactory(session_id) {}

备注:对HandleRead的调用,会出现一下的情况:

(1)收到一个完整的包。deal_length = length,并且返回true就可以了;

(2)收到几个完整包。deal_length=处理包长,将会把剩余的未处理数据和长度再次调用HandleRead;

(3)收到不完整的包。deal_length = length,并且返回false就可以了,下次在收到数据,会把组合的数据和长度发给HandleRead;

(4)收到的包出错。直接返回false,将会忽略本次收到的所有数据;

HandleClose事件说明:

(1)HandleClose事件不是及时调用,主要是为了在移动通信ip地址变换的时候还能保证设备的正常状态(否则,设备会不停上下线)

(2)可以设置session的超时时间,在超时时间都没有数据收发操作,将会触发HandleClose事件;

response参数说明:

(1)赋值后,会自动将数据应答到客户端;

三、新特性

1、支持重叠发送数据,不会出现数据错乱问题(相关内容见AsyncWriteBuffer类);

2、调用简单,用户不需要传递io_service;

3、接口多样,支持多种TcpServer调用;

4、服务器自带PublishOne和PublishAll方法,可指定session或者全部session发送数据;

5、自带UnorderedMapSafe的线程安全hash map,保证多线程的正确性;

6、每个事件都有response消息,当赋值时自动应答数据到客户端,非常适合经典问答模式;

7、性能突出,所有应答都是异步模式;

  下载地址:http://download.csdn.net/detail/wang19840301/8841777

正在封装UDP服务器,有需要的 请留言,我会一并发布上来

有问题,请及时反馈,我好更正

猜你喜欢

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