示例代码

 #include "Util.h"
#include "MyAsio.h"
#include "TcpConnectionManager.h"
#include "SocketMessageRecvDispatchManager.h"
/*
作 者: itdef
技术博客 http://www.cnblogs.com/itdef/
技术交流群 群号码:324164944
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
*/ unsigned int DEF::tcp_connection::i = ;
extern DEF::TcpConnectManager g_tcp_connect_manager;
extern DEF::SocketMessageRecvDispatchManager g_socket_message_recv_dispatch_manager; void DEF::AsioLoopThread() {
try
{
boost::asio::io_service io_service;
DEF::tcp_server server(io_service);
io_service.run();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
} std::thread DEF::StartAsioLoopThread()
{
std::thread t = std::thread(DEF::AsioLoopThread);
return t;
} void DEF::tcp_connection::handle_read_head(const boost::system::error_code& error,
size_t bytes_transferred)
{
//收到错误格式信息
if (error || bufHead_.flag != '|')
{
std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
g_tcp_connect_manager.LeaveWithLock(wp);
std::cerr << __FUNCTION__ << "(). wrong flag or " << error.message()<< std::endl;
return;
} boost::asio::async_read(socket_, boost::asio::buffer(recvBuffBody, bufHead_.bufferLenth),
boost::bind(&tcp_connection::handle_read_body, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
} void DEF::tcp_connection::start()
{
std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
g_tcp_connect_manager.JoinWithLock(wp); boost::asio::async_read(socket_, boost::asio::buffer(&bufHead_, sizeof(bufHead_)),
boost::bind(&tcp_connection::handle_read_head, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
} std::string DEF::SharedPtr2StringId(const std::shared_ptr<DEF::tcp_connection>& ptr) {
std::stringstream ss;
ss << ptr;
std::string str_ptr_id;
ss >> str_ptr_id;
return str_ptr_id;
} void DEF::tcp_connection::handle_read_body(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (error) {
std::weak_ptr<DEF::tcp_connection> wp(shared_from_this());
g_tcp_connect_manager.LeaveWithLock(wp);
std::cerr << __FUNCTION__ <<" "<< error.message()<< std::endl;
return;
}
recvBuffBody[bytes_transferred] = '\0';
//std::cout << "recv " << recvBuffBody << std::endl;
g_socket_message_recv_dispatch_manager.PostSockRecvMessageAndNotify(recvBuffBody);
boost::asio::async_read(socket_, boost::asio::buffer(&bufHead_, sizeof(bufHead_)),
boost::bind(&tcp_connection::handle_read_head, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}

消息队列表

 #pragma once
#include <mutex>
#include <deque>
#include <string> #include "Util.h"
/*
作 者: itdef
技术博客 http://www.cnblogs.com/itdef/
技术交流群 群号码:324164944
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
*/
NAMESPACEBEGIN(DEF) struct MessageQueueWithLock {
std::mutex messageQueuemtx;
std::condition_variable messageQueuecv;
volatile bool ready = false;
std::deque<std::string> messageDeq; void PostMessageAndNotify(const std::string& json) {
std::lock_guard<std::mutex> lck(messageQueuemtx);
messageDeq.push_back(json);
messageQueuecv.notify_one();
} std::string WaitForMessageDequeOnce() {
std::string s;
{
std::unique_lock<std::mutex> lck(messageQueuemtx);
while (messageDeq.empty())
messageQueuecv.wait(lck);
}
{
std::lock_guard<std::mutex> lck(messageQueuemtx);
if (!messageDeq.empty()) {
s = messageDeq.front();
messageDeq.pop_front();
}
}
return s;
}
}; NAMESPACEEND

一个全局管理连接的容器

 #pragma once
#pragma once
#include "Util.h"
#include <map>
#include <mutex>
#include <memory>
#include <sstream> #include "MyAsio.h"
/*
作 者: itdef
技术博客 http://www.cnblogs.com/itdef/
技术交流群 群号码:324164944
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
*/
NAMESPACEBEGIN(DEF)
//class tcp_connection;
class TcpConnectManager {
public:
typedef std::string SOCKWEAKPTRID;
TcpConnectManager() {}
~TcpConnectManager() {} void JoinWithLock(const std::weak_ptr<tcp_connection>& ptr); void LeaveWithLock(const std::weak_ptr<tcp_connection>& ptr); std::weak_ptr<tcp_connection> FindWeakPtrBySockPtrIdWithLock(const std::string& sock_ptr_id);
TcpConnectManager& operator=(const TcpConnectManager&) = delete;
TcpConnectManager(const TcpConnectManager&) = delete;
private:
std::mutex mtx;
std::map<SOCKWEAKPTRID, std::weak_ptr<DEF::tcp_connection>> connection_infos;
}; NAMESPACEEND

boost asio 一个聊天的基本框架的更多相关文章

  1. 改进基于Boost.Asio的聊天服务

    Boost.Asio是个非常易用的C++异步网络库,官方文档中一个示例是聊天服务,分为chat_message.chat_client.chat_server三个部分.chat_server的启动代码 ...

  2. boost asio 网络聊天 代码修改学习

    简化asio的聊天代码 去除ROOM的设计 所有连接客户端均在同一个ROOM下 /*********************************************************** ...

  3. boost::asio实现一个echo服务器

    以前使用ACE实现Server框架,但是觉得太笨重,决定采用boost.asio来写服务器程序: 1.服务器构建在linux上面:当然也可以在windows下运行 2.io部分采用非阻塞模式.业务逻辑 ...

  4. boost asio异步读写网络聊天程序client 实例具体解释

    boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  5. boost asio异步读写网络聊天程序客户端 实例详解

    boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  6. boost.asio新框架的设计概念总结

    1.66版本,boost.asio库重新设计了框架,目前最新版为1.71.读了几天代码后,对框架中相关概念总结.因为是泛型编程的库,所以分析的概念层的设计. 可通过boost官方文档,strand的1 ...

  7. socket通信框架——boost asio

    boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...

  8. (原创)如何使用boost.asio写一个简单的通信程序(二)

    先说下上一篇文章中提到的保持io_service::run不退出的简单办法.因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了, ...

  9. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

随机推荐

  1. 大数据入门到精通4--spark的rdd的map使用方式

    学习了之前的rdd的filter以后,这次来讲spark的map方式 1.获得文件 val collegesRdd= sc.textFile("/user/hdfs/CollegeNavig ...

  2. jms版本

    Java消息服务是一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914). 2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1 ...

  3. 执行SDK的aapt报错./aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./aapt)

    问题| 执行SDK下的aapt报错./aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./aapt)   ../ ...

  4. 【scrapy】其他问题2

    今天爬取豆瓣电影的是时候,出现了两个问题: 1.数据无法爬取并输出Retrying <GET https://movie.douban.com/robots.txt> 看起来像是被拦截了. ...

  5. php 两个值进行比较的问题

    php手册运算符中有介绍: 比较多种类型-- 如var_dump([ ] > 0); // 结果为true 运算数 1 类型 运算数 2 类型 结果 null 或 string string 将 ...

  6. pta l2-16(愿天下有情人都是失散多年的兄妹)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 题意:两个异性的人五服之内不得通婚 ...

  7. Kylin介绍,功能特点【转】

    Apache Kylin是一个开源的分布式分析引擎.完全由eBay Inc.中国团队开发 并贡献至开源社区.提供Hadoop之上的SQL查询接口及多维分析(MOLAP)能力以 支持大规模数据能在亚秒内 ...

  8. JAVA HW2

    MODEL //yuec2 Yue Cheng package hw2; import java.io.File; import java.io.FileNotFoundException; impo ...

  9. 通过PHP CURL模拟请求上传文件|图片。

    现在有一个需求就是在自己的服务器上传图片到其他服务器上面,过程:客户端上传图片->存放到本地服务器->再转发到第三方服务器; 由于前端Ajax受限制,只能通过服务器做转发了. 在PHP中通 ...

  10. 解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX(转)

    原文地址:https://www.cnblogs.com/feng18/p/5646925.html 从网上抓了一些字节流,想打印出来结果发生了一下错误: UnicodeEncodeError: 'g ...