异步socket处理
服务器端:
#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp> class Server
{
private:
boost::asio::io_service &ios;
boost::asio::ip::tcp::acceptor acceptor;
typedef boost::shared_ptr<boost::asio::ip::tcp::socket> sock_pt;
public:
Server(boost::asio::io_service &io) : ios(io),
acceptor(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 6688))
{
start();
} void start()
{
sock_pt sock(new boost::asio::ip::tcp::socket(ios)); // 智能指针
acceptor.async_accept(*sock,
boost::bind(&Server::accept_handler, this, _1, sock)); // 异步监听服务
} void accept_handler(const boost::system::error_code &e, sock_pt sock)
{
if (e) // 检测错误码
{
return;
}
std::cout << "client: ";
std::cout << sock->remote_endpoint().address() << std::endl;
sock->async_write_some(boost::asio::buffer("hello client..."),
boost::bind(&Server::write_hander, this, _1));
start(); // 再次启动异步监听
} void write_hander(const boost::system::error_code &e)
{
std::cout << "send message complete." << std::endl;
}
};
int main()
{
try
{
std::cout << "server start..." << std::endl;
boost::asio::io_service ios;
Server server(ios);
ios.run(); // 启动异步调用事件处理循环
}
catch (std::exception &e)
{
std::cout << e.what() << std::endl;
}
return 0;
}
客户端:
#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <vector> class Client
{
private:
boost::asio::io_service &ios;
boost::asio::ip::tcp::endpoint ep;
typedef boost::shared_ptr<boost::asio::ip::tcp::socket> sock_pt;
public:
Client(boost::asio::io_service &io) :ios(io),
ep(boost::asio::ip::address::from_string("127.0.0.1"), 6688)
{
start(); // 启动异步连接
}
void start()
{
sock_pt sock(new boost::asio::ip::tcp::socket(ios));
sock->async_connect(ep, boost::bind(&Client::conn_hander, this, _1, sock)); // 异步连接
}
void conn_hander(const boost::system::error_code &e, sock_pt sock)
{
if (e)
{
return;
}
std::cout << "recive from " << sock->remote_endpoint().address() << ": ";
boost::shared_ptr<std::vector<char> > str(new std::vector<char>(100, 0));
sock->async_read_some(boost::asio::buffer(*str),
boost::bind(&Client::read_hander, this, _1, str)); // 异步读取数据
start(); // 再次启动异步连接
}
void read_hander(const boost::system::error_code &e, boost::shared_ptr<std::vector<char> > str)
{
if (e)
{
return;
}
std::cout << &(*str)[0] << std::endl;
}
};
int main()
{
try
{
std::cout << "client start..." << std::endl;
boost::asio::io_service ios;
Client client(ios);
ios.run();
}
catch (std::exception &e)
{
std::cout << e.what() << std::endl;
} return 0;
}
异步socket处理的更多相关文章
- GJM :异步Socket [转载]
原帖地址:http://blog.csdn.net/awinye/article/details/537264 原文作者:Awinye 目录(?)[-] 转载请原作者联系 Overview of So ...
- Python简易聊天工具-基于异步Socket通信
继续学习Python中,最近看书<Python基础教程>中的虚拟茶话会项目,觉得很有意思,自己敲了一遍,受益匪浅,同时记录一下. 主要用到异步socket服务客户端和服务器模块asynco ...
- 项目笔记---C#异步Socket示例
概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域,或者被合并或者仍然应用于某 ...
- Socket&GCDAsyncSocket(异步Socket)
Socket ********************************************* 简单理解Socket 就是网络连接,可以实现两个点之间的数据通讯. •Socket允许使用长连 ...
- AndroidAsync :异步Socket,http(client+server),websocket和socket.io的Android类库
AndroidAsync是一个用于Android应用的异步Socket,http(client+server),websocket和socket.io的类库.基于NIO,没有线程.它使用java.ni ...
- 可扩展多线程异步Socket服务器框架EMTASS 2.0 续
转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...
- C# 实现的多线程异步Socket数据包接收器框架
转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...
- C# 异步Socket
C# 异步Socket (BeginXXXX)服务器代码 前言: 1.最近维护公司的一个旧项目,是Socket通讯的,主要用于接收IPC(客户端)发送上来的抓拍图像,期间要保持通讯,监测数据包并进行处 ...
- C#异步Socket示例
C#异步Socket示例 概要 在C#领域或者说.net通信领域中有着众多的解决方案,WCF,HttpRequest,WebAPI,Remoting,socket等技术.这些技术都有着自己擅长的领域, ...
- [Unity Socket]在Unity中如何实现异步Socket通信技术
在刚刚开发Unity项目的过程中,需要用到即时通信功能来完成服务器与客户端自定义的数据结构封装. 现在将部分主要功能的实现代码抽取出来实现了可以异步Socket请求的技术Demo. 客户端脚本Clie ...
随机推荐
- python中shutil模块
shutil是对OS中文件操作的补充:移动.复制.打包.压缩.解压. 1.copy文件内容到另一个文件,可以copy指定大小的内容. shutil.copyfileobj(fsrc, fdst[, l ...
- Django 日志
Django使用Python内置的logging模块实现它自己的日志系统. 如果你没有使用过logging模块,请参考Python教程中的相关章节. 直达链接<logging模块详解>. ...
- link和@import区别
推荐使用:link 区别 1.从属关系区别@import是 CSS 提供的语法规则,只有导入样式表的作用:link是HTML提供的标签,不仅可以加载 CSS 文件,还可以定义 RSS.rel 连接属性 ...
- datagrid数据表格当数据为0的时候页面不显示数据
如下图: datagrid数据表格当数据为0的时候页面不显示数据,为空的表格数据全是0,但是页面无法显示 传递的json数据也是没问题的: 所以实在想不通,为什么easyUI datagrid 不显示 ...
- python 断言大全
参考链接:https://blog.csdn.net/qq1124794084/article/details/51668672 1. 小数位模糊等于 自动化脚本最重要的是断言,正确设置断言以后才能帮 ...
- spring cloud: Hystrix(三):健康指数 health Indicator
spring cloud: Hystrix(三):健康指数 health Indicator ribbon+hystrix 当使用Hystrix时(spring-cloud-starter-hystr ...
- 分享基于EF+WCF的通用三层架构及解析
本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: ...
- 用 JS 设置图片的最大宽度
//用 JS 设置图片的最大宽度 function setImgsMaxWidth() { $('.answerimg img').each(function () { ...
- python基础之小数据池,is和==区别 编码问题
主要内容 小数据池,is和==区别 编码问题 小数据池 一种缓存机制,也称为驻留机制,是为了能更快提高一些字符串和整数的处理速度is 和 == 的区别 == 主要指对变量值是否相等的判断,只要数值相同 ...
- bzoj4176. Lucas的数论 杜教筛
题意:求\(\sum_{i=1}^n\sum_{j=1}^nd(ij),d是约数个数函数\) 题解:首先有一个结论\(d(ij)=\sum_{x|i}\sum_{y|j}[(i,j)==1]\) 那么 ...