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

  Boost.Asio是个非常易用的C++异步网络库,官网上有很详细文档和示例代码。其中一个示例是聊天服务,分成chat_message、chat_client、chat_server这么三个部分。chat_server的启动代码如下。

 1     if (argc < 2)
 2     {
 3       std::cerr << "Usage: chat_server <port> [<port> ...]\n";
 4       return 1;
 5     }
 6
 7     boost::asio::io_service io_service;
 8
 9     chat_server_list servers;
10     for (int i = 1; i < argc; ++i)
11     {
12       using namespace std; // For atoi.
13       tcp::endpoint endpoint(tcp::v4(), atoi(argv[i]));
14       chat_server_ptr server(new chat_server(io_service, endpoint));
15       servers.push_back(server);
16     }
17
18     io_service.run();

  从中可以看出,输入多个端口号会启动多个chat_server,但只有一个io_service,也就是说多个chat_server中产生的异步任务handler被放入同一个任务队列(由唯一的io_service维护),这就相当于用一个线程同时处理多个聊天服务器,自然会对系统的性能产生影响。

  从io_service_pool这个示例中可以得到一点改进的启发,每个chat_server绑定一个io_service,每个io_service在一个独立的线程中运行,这样就能充分利用机器的多核性能,改进代码如下。

 1         if (argc < 2)
 2         {
 3             std::cerr << "Usage: chat_server <port> [<port> ...]\n";
 4             return 1;
 5         }
 6
 7         typedef boost::shared_ptr<boost::asio::io_service> io_service_ptr;
 8         typedef std::list<io_service_ptr> io_service_list;
 9
10         chat_server_list servers;
11         io_service_list services;
12         for (int i = 1; i < argc; ++i)
13         {
14             using namespace std; // For atoi.
15             tcp::endpoint endpoint(tcp::v4(), atoi(argv[i]));
16             io_service_ptr service(new boost::asio::io_service);
17             chat_server_ptr server(new chat_server(*service, endpoint));
18             services.push_back(service);
19             servers.push_back(server);
20         }
21
22         std::vector<std::shared_ptr<std::thread> > threads;
23         for(auto service : services)
24         {
25             auto run_func = [](const io_service_ptr& ptr) {
26                 return ptr->run();
27             };
28             std::function<std::size_t()> f = std::bind(run_func, service);
29             std::shared_ptr<std::thread> thread(new std::thread(f));
30             threads.push_back(thread);
31         }
32
33         // Wait for all threads in the pool to exit.
34         for (std::size_t i = 0; i < threads.size(); ++i) {
35             threads[i]->join();
36         }    
时间: 2024-09-30 23:59:16

改进基于Boost.Asio的聊天服务的相关文章

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

简化asio的聊天代码 去除ROOM的设计 所有连接客户端均在同一个ROOM下 chat message 使用boost自带示例的头文件 #pragma once #include <cstdio> #include <cstdlib> #include <cstring> class chat_message { public: enum { header_length = 4 }; enum { max_body_length = 512 }; chat_messa

基于boost::asio封装搭建的简单服务器

经过一天的简单学习,尝试自己写一个简单的服务器,能够实现以下三大回调功能:onConnect onMessage onClose 下面直接贴出代码 1.BaseServer抽象类 BaseServer.h /* name:BaseServer use:the basest server author:hezijian([email protected]) */ #ifdef _MSC_VER #define _WIN32_WINNT 0x0501 #endif #ifndef _BASE_SER

Boost Asio初探

一.简介 Boost Asio ( asynchronous input and output)关注数据的异步输入输出.Boost Asio 库提供了平台无关性的异步数据处理能力(当然它也支持同步数据处理).一般的数据传输过程需要通过函数的返回值来判断数据传输是否成功,而Boost Asio将数据传输分为两个独立的步骤: 采用异步任务的方式开始数据传输. 将传输结果通知调用端 与传统方式相比,它的优势在于程序在数据传输期间不会被阻塞. 二.I/O Services 与 I/O Objects 应

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

// // chat_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://ww

Boost.Asio技术文档

Christopher Kohlhoff Copyright ? 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完

boost::asio译文

Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完

Boost.Asio的使用技巧

基本概念 Asio proactor I/O服务 work类 run() vs poll() stop() post() vs dispatch() buffer类 缓冲区管理 I/O对象 socket 信号处理 定时器 strand 参考 最近尝试使用了一下Boost.Asio,不知道是否因为各大公司都有自己相对成熟的网络库的缘故,网络上Asio相关的资料实在不多,而且很多翻来覆去就是那几个简单的示例,所以打算自己小结一下.总的来说Boost.Asio是个非常易用的库,避免了你在各种系统底层A

boost.asio包装类st_asio_wrapper开发教程(一)

一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_wrapper的特点效率高.跨平台.完全异步,当然这是从boost.asio继承而来:自动重连,数据透明传输,自动解决分包粘包问题(必须使用默认的打包解包器,这一特性表现得与udp一样):只支持tcp和udp协议: 三:st_asio_wrapper的大体结构st_asio_wrapper.h:编译器

boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统:二:st_asio_wrapper的特点效率高.跨平台.完全异步,当然这是从boost.asio继承而来:自动重连,数据透明传输,自动解决分包粘包问题(必须使用默认的打包解包器,这一特性表现得与udp一样):只支持tcp和udp协议:三:st_asio_wrapper的大体结构st_asio_wrapper.h:编译器版本