王子原创作品。转载请注明出处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
#include "ClientMessageFactory.h"
#include
#include
#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
MyTcpServer my_tcp_server(10002);
IoServicePool::singleton::GetInstance()->Run();
}
一、提供两种调用方法:
1、原始TcpServer类,调用SetMessageFactory绑定事件;
TcpServer tcp_server(10001);
tcp_server.SetMessageFactory(shared_ptr
2、继承TcpServer类,重写GetMessageFactory方法;
MyTcpServer my_tcp_server(10002);
二、ClientMessageFactory类说明
1. 头文件代码
#pragma once
#include
class ClientMessageFactory : public klicen::asio::ip::MessageFactory
{
public:
ClientMessageFactory(const string& session_id = "");
virtual shared_ptr
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
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
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
{
return make_shared
}
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服务器,有需要的 请留言,我会一并发布上来
有问题,请及时反馈,我好更正