今天主要想说道说道boost里面的网络通信库怎样设计和使用,由于近期一直在和网络一起工作,大数据处理和机器学习都离不开最后使用网络进行上线部署。先看看所有的源码吧。

#include <cstdlib>
#include <iostream>
#include <memory>
#include <utility>
#include <boost/asio.hpp>
#include <stdint.h>
#include "data.h"
#include <ostream>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp> using boost::asio::ip::tcp; class session
: public std::enable_shared_from_this < session >
{
public:
session(boost::asio::ip::tcp::socket socket)
: socket_(std::move(socket))
{
} void start()
{
do_read();
} private:
void do_read()
{
auto self(shared_from_this()); //int32_t data_length;
boost::asio::async_read(socket_,
boost::asio::buffer(&data_length, 4),
[this, self](boost::system::error_code ec, std::size_t length)
{
if (!ec)
{
do_read_body();
}
});
}
void do_read_body()
{ auto self(shared_from_this());
boost::asio::async_read(socket_,
buf_, boost::asio::transfer_exactly(data_length),
[this, self](boost::system::error_code ec, std::size_t length)
{
std::cout << length<<std::endl;
if (!ec)
{
ProcessMessage();
do_read();
}
else
{
std::cout << "error" << std::endl;
}
});
}; void ProcessMessage()
{
boost::archive::binary_iarchive ia(buf_);
translate_data message;
ia >> message;
std::cout << message.width<<std::endl;
}; int32_t data_length; boost::asio::ip::tcp::socket socket_; boost::asio::streambuf buf_;
}; class server
{
public:
server(boost::asio::io_service& io_service, short port)
: acceptor_(io_service, boost::asio::ip::tcp::endpoint(tcp::v4(), port)),
socket_(io_service)
{
do_accept();
} private:
void do_accept()
{
acceptor_.async_accept(socket_,
[this](boost::system::error_code ec)
{
if (!ec)
{
std::make_shared<session>(std::move(socket_))->start();
} do_accept();
});
} boost::asio::ip::tcp::acceptor acceptor_;
boost::asio::ip::tcp::socket socket_;
}; int main(int argc, char* argv[])
{
try
{
/*if (argc != 2)
{
std::cerr << "Usage: async_tcp_echo_server <port>\n";
return 1;
}*/ boost::asio::io_service io_service; server s(io_service, 8888); io_service.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
} return 0;
}

这个就是服务区的所有源码。

data是消息的数据格式,translate_data 这个类的定义,该类能够使用boost进行序列化。整个消息处理起来很的流畅,能够使得我们仅仅关心数据流,而忽略server怎样异步接收消息。当然我的演示样例代码中的数据格式很之简单,数据包开头的int表示数据有多少个字节。索性连我的消息代码一起放出来:

#include <boost/serialization/array.hpp>
#include <boost/serialization/vector.hpp> struct MeasurementZ
{
double m_a[3];
double m_w[3];
double m_t;
friend class boost::serialization::access; template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & boost::serialization::make_array(m_a, 3 * sizeof(double));
ar & boost::serialization::make_array(m_w, 3 * sizeof(double));
ar & m_t;
}
}; struct translate_data
{
int width;
int height;
double mt;
int N;
unsigned char* buffer;//640*480; std::vector<MeasurementZ> z;
std::vector<double> Quaterniond;//4
std::vector<double> Vector3d;//3
double M_rM_t;
};
BOOST_SERIALIZATION_SPLIT_FREE(translate_data)
namespace boost
{
namespace serialization
{
/** Serialization support for cv::Mat */
template<class Archive>
void save(Archive & ar, const translate_data& m, const unsigned int version)
{
ar & m.width;
ar & m.height;
ar & m.mt;
ar & m.N; const size_t data_size = m.width * m.height*sizeof(unsigned char);
ar & boost::serialization::make_array(m.buffer, data_size);
ar & m.z;
ar & m.Quaterniond;
ar & m.Vector3d;
ar & m.M_rM_t;
} /** Serialization support for cv::Mat */
template <class Archive>
void load(Archive & ar, translate_data& m, const unsigned int version)
{
ar & m.width;
ar & m.height;
ar & m.mt;
ar & m.N; const size_t data_size = m.width * m.height*sizeof(unsigned char);
m.buffer = new unsigned char[m.width*m.height];
ar & boost::serialization::make_array(m.buffer, data_size);
ar & m.z;
ar & m.Quaterniond;
ar & m.Vector3d;
ar & m.M_rM_t;
}
}
};

整个project很easy,请有用c++11标准来完毕。

Boost Asioserver使用的更多相关文章

  1. boost强分类器的实现

    boost.cpp文件下: bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, int _numSampl ...

  2. Boost信号/槽signals2

    信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便.项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定. signa ...

  3. 玩转Windows服务系列——使用Boost.Application快速构建Windows服务

    玩转Windows服务系列——创建Windows服务一文中,介绍了如何快速使用VS构建一个Windows服务.Debug.Release版本的注册和卸载,及其原理和服务运行.停止流程浅析分别介绍了Wi ...

  4. boost::function的用法

    本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1.  介绍 Boost.Func ...

  5. Boost条件变量condition_variable_any

    Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用.使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足.如果条件不满足,则释放锁 ...

  6. 新手,Visual Studio 2015 配置Boost库,如何编译和选择,遇到无法打开文件“libboost_thread-vc140-mt-gd-1_63.lib“的解决办法

    1,到官网下载最新的boost,www.boost.org 这里我下载的1-63版本. 2,安装,解压后运行bootstrap.bat文件.稍等一小会就OK. 3,编译boost库.注意一定要使用VS ...

  7. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  8. vs2013给项目统一配置boost库

    1.打开项目,然后点击菜单中的 视图->其他窗口->属性管理器 2. 打开属性管理器,点击项目前的箭头,展开项目,找到debug或者release下面的Microsoft.Cpp.Win3 ...

  9. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

随机推荐

  1. Sqoop hive 和mysql 交互 完整案例

    本文完成:在hive里建管理表:注入部分数据:利用sqoop导入mysql中 期间:解决中文乱码问题   飞行报告故障表 建表命令 查看表 人工灌入少量数据 Windows系统向Linux系统数据传输 ...

  2. spark查看stage和tasks信息

    spark提供了web-ui接口.外部命令等多种方法监视spark程序的执行状态.利用spark的监视功能,可以方便的查看spark应用程序执行的状态,具体包括:1)stage和tasks列表信息  ...

  3. The user specified as a definer ('root'@'%') does not exist 解决方法

    mysql> grant all privileges on *.* to root@"%" identified by "."; Query OK, r ...

  4. jstree的基本使用例子

    var menu = (function() { var _menu = {data:{}, initMenu : function() { $.jstree.defaults.core.themes ...

  5. Mybatis学习总结一

    一.Mybatis架构  JAR包下载地址 1.  mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息. mapper. ...

  6. pringboot开启找回Run Dashboard

    代码中加入 <option name="configurationTypes"> <set> <option value="SpringBo ...

  7. [Python数据结构] 使用List实现Stack

    [Python数据结构] 使用List实现Stack 1. Stack 堆栈(Stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型(ADT),其特殊之处在于只能允许在阵列的一端进 ...

  8. mysql insert一条记录后 返回创建记录主键id的方法

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  9. 转载:tomcat实现热部署的配置

    tomcat实现热部署的配置   我们实现热部署后,自然就可以通过maven操作tomcat了,所以就需要maven取得操作tomcat的权限,现在这一步就是配置tomcat的可操作权限. 进入tom ...

  10. Django-REST-Framework JWT 实现SSO认证(下)

    在上一篇博客中,我已经对JSON Web 认证做了简单的解释,这篇博客是续篇,若不了解,请看上一篇博客:https://www.cnblogs.com/yushenglin/p/10863184.ht ...