异步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 ...
随机推荐
- redis简介(未完成)
redis是一个用c语言开发的一个开源的高性能键值对(key-value)数据库,基本类型: 1)字符串型 string 2)字符串列表 lists 3)字符串集合 sets 4)有序字符串集合 so ...
- prometheus的agent 二次开发代码参考
import com.codahale.metrics.MetricRegistry;import io.prometheus.client.CollectorRegistry;import io.p ...
- linq to sql and linq to object 总结
Enumable类型是linq to object 是一个很特殊的类型 这个类型的数据源都是在程序的内存中 Queryable类型是 Linq to sql 对数据库进行操作都是这个类型 ...
- 关于table动态添加数据 单元格合并 数组合并
var newArr = [ {"BranchID":1,"BranchName":"城二","BranchFullName&qu ...
- linux修改网卡名为eth0
方法1: 1.编辑网卡的配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将里面的NAME和DEVICE项修改为eth0,ONBOOT修改为yes. ...
- idel 快捷键 记录
1.找到实现一个类或者接口子类的快捷键 ctrl + B父类或父方法定义 ctrl + alt + B子类或子方法实现 2.跳转上次 下次 操作 ctrl + alt + --> / < ...
- for...in和for...of循环的区别
使用for...in和for...of分别对Array,Set,Map做测试 var a=["A","B","C"]; var b=new ...
- idea ----> 使用idea工具整合mybaiti时出现的问题总结
使用idea测试mabtis实例时出现 java.lang.IllegalArgumentException: Mapped Statements collection does not conta ...
- ionic3 打包一个已签名的apk
1 进入ionic官方文档,点击左边导航菜单,找到INTRO下的Deploying2 终端进入项目目录(根据项目环境定是否需要root权限)3 运行命令ionic cordova build andr ...
- LeetCode--012--整数转罗马数字(java)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...