BOOST TCP 异步 网络通信
2017-08-11 14:29
169 查看
TCP服务端-异步
①"TCPServerASYNC.h"
③自定义定时器 "LHCTimer.h"
TCP客户端-异步
①"TCPClientASYNC.h"
①"TCPServerASYNC.h"
#ifndef TCPServerASYNC_h__ #define TCPServerASYNC_h__ #include <boost/bind.hpp> #include <boost/asio.hpp> //////////////////////////////////////////////////////////////////////////////////////////////////// // <summary> TCP服务端-异步; </summary> // // 在异步模式下,程序除了要发起IO操作,还要定义一个用于回调的完成处理函数; // io_service同样把IO操作转交给操作系统执行,但它不同步等待,而是立即返回; // 调用io_service的run()成员函数可以等待异步操作完成,当异步操作完成时; // io_service从操作系统获取执行结果,调用完成处理函数; // // <remarks> 2017.6.8 </remarks> //////////////////////////////////////////////////////////////////////////////////////////////////// typedef boost::shared_ptr<boost::asio::ip::tcp::socket> SockPtr; class TCPServerASYNC { public: TCPServerASYNC( boost::asio::io_service &ios, boost::asio::ip::tcp::endpoint &endpoint ); void Start(); //Start函数用于启动异步接受连接; void AcceptHandler( const boost::system::error_code & ec, SockPtr sockPtr ); //当有TCP连接发生时,AcceptHandler()函数将被调用,它使用socket对象发送数据; void WriteHandler( const boost::system::error_code & ec ); //发送数据,发送完毕调用此函数输出信息; private: boost::asio::io_service &IOS; boost::asio::ip::tcp::endpoint &EndPoint; boost::asio::ip::tcp::acceptor Acceptor; }; #endif // TCPServerASYNC_h__②"TCPServerASYNC.cpp"
#include <iostream> #include "TCPServerASYNC.h" TCPServerASYNC::TCPServerASYNC( boost::asio::io_service &ios, boost::asio::ip::tcp::endpoint &endpoint ) :IOS( ios ) ,EndPoint( endpoint ) ,Acceptor( IOS, EndPoint ) { } //Start函数用于启动异步接受连接,需要调用acceptor的async_accept()函数; //为了能够让socket对象能够被异步调用后还能使用; //我们必须使用shared_ptr来创建socket对象的智能指针; //它可以在程序的整个生命周期中存在,直到没人使用它为止; void TCPServerASYNC::Start() { SockPtr sockPtr( new boost::asio::ip::tcp::socket(IOS) ); //异步侦听服务,有连接请求后调用AcceptHandler函数; Acceptor.async_accept( *sockPtr, boost::bind( &TCPServerASYNC::AcceptHandler, this, boost::asio::placeholders::error, sockPtr ) ); } //当有TCP连接发生时,AcceptHandler()函数将被调用,它使用socket对象发送数据; void TCPServerASYNC::AcceptHandler( const boost::system::error_code & ec, SockPtr sockPtr ) { if ( ec ) //检测错误码; { return; } std::cout << "client : " << sockPtr->remote_endpoint().address() << std::endl; //发送数据,发送完毕后,调用WriteHandler()函数; sockPtr->async_write_some( boost::asio::buffer("Hello TCP"), boost::bind(&TCPServerASYNC::WriteHandler, this, boost::asio::placeholders::error) ); } void TCPServerASYNC::WriteHandler( const boost::system::error_code & ec ) { if ( ec ) //检测错误码; { return; } std::cout << "Send MSG complete." << std::endl; }
③自定义定时器 "LHCTimer.h"
#ifndef LHCTimer_h__ #define LHCTimer_h__ #include <boost/bind.hpp> #include <boost/asio.hpp> #include <boost/date_time/posix_time/posix_time.hpp> //////////////////////////////////////////////////////////////////////////////////////////////////// // <summary> 自定义计时器,该计时器在second秒后结束,结束后执行func函数,循环countMax次; </summary> // <remarks> 2017.6.8 </remarks> /////////////////////////////////////// bbd5 ///////////////////////////////////////////////////////////// class LHCTimer { public: //////////////////////////////////////////////////////////////////////////////////////////////////// // <summary> 自定义计时器的模板构造函数; </summary> // // second:计时器Timer结束时间; // countMax:计时器Timer执行的次数; // func:计时器结束后,所要执行的外部函数; // <remarks> 2017.6.8 </remarks> //////////////////////////////////////////////////////////////////////////////////////////////////// template<typename F> LHCTimer( boost::asio::io_service &ios, int second, int countMax, F func ); //回调函数,调用次数为Count_Max,回调函数为Fun(); void CallFunc( const boost::system::error_code & ) { if ( Count > Count_Max ) { return; } ++Count; Fun(); D_Timer.expires_at( D_Timer.expires_at() + boost::posix_time::seconds( Seconds ) ); //设置定时器的终止时间为Seconds秒; D_Timer.async_wait( boost::bind(&LHCTimer::CallFunc, this, boost::asio::placeholders::error) ); //异步等待计时器,注册回调函数; } private: int Count; //计数用; int Count_Max; //计时器Timer执行的次数; int Seconds; //计时器Timer结束时间; boost::function<void()> Fun; //计时器结束后,所要执行的外部函数; boost::asio::deadline_timer D_Timer; //计时器变量; }; template<typename F> //模板类型,可以接受任意可调用物; LHCTimer::LHCTimer( boost::asio::io_service &ios, int second, int countMax, F func ) :Fun(func) ,Seconds(second) ,Count_Max(countMax) ,D_Timer(ios, boost::posix_time::seconds(second)) //启动计时器; { Count = 1; D_Timer.async_wait( boost::bind(&LHCTimer::CallFunc, this, boost::asio::placeholders::error) ); //异步等待计时器,注册回调函数; } #endif // LHCTimer_h__④main.cpp
#include <iostream> #include "LHCTimer.h" #include "TCPServerASYNC.h" int main( int argc, char * argv[] ) { //TCP服务器端-异步; // 在异步模式下,程序除了要发起IO操作,还要定义一个用于回调的完成处理函数; // io_service同样把IO操作转交给操作系统执行,但它不同步等待,而是立即返回; // 调用io_service的run()成员函数可以等待异步操作完成,当异步操作完成时; // io_service从操作系统获取执行结果,调用完成处理函数; { try { std::cout << "Server start." << std::endl; boost::asio::io_service ios; boost::asio::ip::tcp::endpoint endpoint( boost::asio::ip::tcp::v4(), 6688 ); TCPServerASYNC server( ios, endpoint ); //创建计时器,每隔2秒,执行TCPClient函数,执行5次; LHCTimer timer( ios, 2, 5, boost::bind(&TCPServerASYNC::Start, &server) ); //调用io_service的run()成员函数可以等待异步操作完成; //当前run()用于等待LHCTimer计时器的异步操作,而非TCPClient绑定函数; ios.run(); //很重要,异步IO必须;她启动前摄器的时间处理循环,阻塞等待所有的操作完成并分派事件; //如果不调用run() 那么虽然操作被异步执行了,但没有一个等待它完成的机制,回调函数得不到执行机会; } catch ( boost::system::system_error &e ) { std::cout << "process failed : " << e.what() << std::endl; } } system( "pause" ); return 0; }
TCP客户端-异步
①"TCPClientASYNC.h"
#ifndef TCPClientASYNC_h__ #define TCPClientASYNC_h__ #include <boost/bind.hpp> #include <boost/asio.hpp> //////////////////////////////////////////////////////////////////////////////////////////////////// // <summary> TCP客户端-异步; </summary> // // 在异步模式下,程序除了要发起IO操作,还要定义一个用于回调的完成处理函数; // io_service同样把IO操作转交给操作系统执行,但它不同步等待,而是立即返回; // 调用io_service的run()成员函数可以等待异步操作完成,当异步操作完成时; // io_service从操作系统获取执行结果,调用完成处理函数; // // <remarks> 2017.6.8 </remarks> //////////////////////////////////////////////////////////////////////////////////////////////////// typedef boost::shared_ptr<boost::asio::ip::tcp::socket> SockPtr; class TCPClientASYNC { public: TCPClientASYNC( boost::asio::io_service &ios, boost::asio::ip::tcp::endpoint &endpoint ); void Start(); //Start函数用于启动异步接受连接; void ConnHandler( const boost::system::error_code & ec, SockPtr sockPtr ); //连接成功被调用,异步读取数据,并再启动一个异步连接; void ReadHandler( const boost::system::error_code & ec, boost::shared_ptr<std::vector<char>> str ); //异步读取结束时调用,输出信息; private: boost::asio::io_service &IOS; boost::asio::ip::tcp::endpoint &EndPoint; }; #endif // TCPClientASYNC_h__②"TCPClientASYNC.cpp"
#include <iostream> #include "TCPClientASYNC.h" TCPClientASYNC::TCPClientASYNC( boost::asio::io_service &ios, boost::asio::ip::tcp::endpoint &endpoint ) :IOS( ios ) ,EndPoint( endpoint ) { } void TCPClientASYNC::Start() { SockPtr sock( new boost::asio::ip::tcp::socket(IOS) ); //启动异步连接,连接成功后调用ConnHandler函数; sock->async_connect( EndPoint, boost::bind( &TCPClientASYNC::ConnHandler, this, boost::asio::placeholders::error, sock ) ); } void TCPClientASYNC::ConnHandler( const boost::system::error_code & ec, SockPtr sockPtr ) { if ( ec ) //检测错误码; { return; } std::cout << "recive from " << sockPtr->remote_endpoint().address() << std::endl; //建立连接数据的缓冲区; boost::shared_ptr<std::vector<char>> str( new std::vector<char>(100, 0) ); //异步读取数据,异步读取结束后,调用ReadHandler()函数; sockPtr->async_read_some( boost::asio::buffer(*str), boost::bind(&TCPClientASYNC::ReadHandler, this, boost::asio::placeholders::error, str) ); } void TCPClientASYNC::ReadHandler( const boost::system::error_code & ec, boost::shared_ptr<std::vector<char>> str ) { if ( ec ) //检测错误码; { return; } std::cout << &(*str)[0] << std::endl; }③main.cpp
#include <boost/ref.hpp> #include "LHCTimer.h" #include "TCPClientASYNC.h" int main( int argc, char * argv[] ) { //TCP客户端-异步; // 在异步模式下,程序除了要发起IO操作,还要定义一个用于回调的完成处理函数; // io_service同样把IO操作转交给操作系统执行,但它不同步等待,而是立即返回; // 调用io_service的run()成员函数可以等待异步操作完成,当异步操作完成时; // io_service从操作系统获取执行结果,调用完成处理函数; { try { std::cout << "client start." << std::endl; boost::asio::io_service ios; boost::asio::ip::tcp::endpoint ep( boost::asio::ip::address::from_string("127.0.0.1"), 6688 ); //创建TCP客户端对象; TCPClientASYNC server( ios, ep ); //创建计时器,每隔2秒,执行TCPClient函数,执行5次; LHCTimer timer( ios, 2, 5, boost::bind(&TCPClientASYNC::Start, &server) ); //调用io_service的run()成员函数可以等待异步操作完成; //当前run()用于等待LHCTimer计时器的异步操作,而非TCPClient绑定函数; ios.run(); //很重要,异步IO必须;她启动前摄器的时间处理循环,阻塞等待所有的操作完成并分派事件; //如果不调用run() 那么虽然操作被异步执行了,但没有一个等待它完成的机制,回调函数得不到执行机会; } catch ( boost::system::system_error &e ) { std::cout << "process failed : " << e.what() << std::endl; } } system( "pause" ); return 0; }
相关文章推荐
- 网络通信框架Volley之一——获取String数据和图片的异步加载
- IOS 网络通信 异步请求
- 一. Volley简介 Volley的中文翻译为“齐射、并发”,是在2013年的Google大会上发布的一款Android平台网络通信库,具有网络请求的处理、小图片的异步加载和缓存等功能,能够帮助
- 网络通信——socket(TCP/IP).Http,同步和异步的区别
- 发布一个采用boost::asio写的异步网络通信模块
- 【java面试系列之网络编程】TCP和UDP的区别、TCP协议的三次握手和四次挥手、TCP协议的通信状态、网络编程时的同步、异步、阻塞、非阻塞、进程间的通信方式、TCP的流量控制和拥塞控制
- 异步非阻塞套接字Winsock开发网络通信程序的经典入门
- twisted是python实现的基于事件驱动的异步网络通信构架。
- 【Android】Volley网络异步通信框架的使用
- 异步非阻塞套接字Winsock开发网络通信程序的经典入门
- Android使用AsyncTask异步线程网络通信获取数据(get json)
- 一个基于VB.net的异步Socket网络TCP通信可防止任意一端意外终止TCP连接的类,。
- APUE读书笔记-16网络通信-08非阻塞和异步IO
- 转: 异步非阻塞套接字Winsock开发网络通信程序的经典入门
- 【Android】Volley网络异步通信框架的使用
- 下载基于REST、SPDY、异步IO深入规模化网络、信息安全、通信优化企业应用系统
- 【网络通信】CAsyncSocket异步套接字中的注意点
- 异步非阻塞套接字Winsock开发网络通信程序的经典入门
- 网络通信 --> 同步、异步、阻塞与非阻塞介绍
- 关于同步(Sync),异步(Async),阻塞(Block),非阻塞等网络通信的一些解释