今天主要想说道说道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. Pro ASP.NET Core MVC 6th 第三章

    第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解 ...

  2. Java Servlet JSP编程(一)

    最近想学学java编程,java现在的应用还是挺广泛的,有必要学习一下. # index.jsp <%@ page language="java" contentType=& ...

  3. 网络编程-socketserver

    网络编程使用socketserver,通常包括以下几步:一.定义类,并继承socketserver.BaseRequestHandler 二.重写handle方法 三.实例化TCPServer,并传递 ...

  4. MyBatis 的基本介绍及使用

    一.简介 ​ MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架(ORM).MyBatis 可以使用简单的 XML 或 注解用于配置和映射数据表,是将 POJO(Plain Old ...

  5. TWaver MONO模板库新鲜出炉 精彩纷呈

    MONO Design在线3D建模平台网站, www.mono-design.cn,开发组的成员们已经开始紧锣密鼓的对这个平台进行内测.在之前的文章里,我们提到用户可以获得多种多样的TWaver官方模 ...

  6. NAT、NAPT(PAT)的基本概念和工作原理及区别

    转自:http://blog.sina.com.cn/s/blog_5d302bd20100gprv.html 近年来,随着 Internet 的迅猛发展,连入 Internet 的主机数量成倍增长. ...

  7. 去重 取最大的一条sql

    select T.BILL_CODE,t.SCAN_TYPE,t.PIECE,SCAN_SITE,SCAN_MAN, row_number() over(partition by t.bill_cod ...

  8. LCS(HDU_5495 循环节)

    传送门:LCS 题意:给出两个序列an和bn,想在给出一个序列pn,问经过a[p1],,,,a[pn]和b[p1],,,b[pn]变换后序列a和序列b的最长公共子序列的长度是多少. 思路:对a[i]- ...

  9. 把 web 项目部署到 Linux 服务器上

    1.打开 eclipse,在已经完成的 web 项目上面点击右键,选择 export,然后选择导出成 war 包. 以部署 SMBMS 项目为例   2.项目打包成 war ,选择项目导出到的位置. ...

  10. Python学习第二阶段Day2,模块subprocess、 logging、re

    1.logging 日志开关,设置全局只打印什么级别的日子,默认是warning以下的都不打印 改默认级别:依次升高 logging.debug("") logging.info( ...