利用boost:asio写的简单聊天服务器一

原创 2013年12月05日 14:34:30

前几天接到老大一个学习实践任务——编写简单的聊天服务器,我对网络编程和boost库不太熟悉,临时抱佛脚写了一个服务端和测试客户端,进过测试可以完成聊天的基本功能,但是还有很多不足,比如客户端输入消息的格式容错不强,没有对客户端长消息的处理等等,也希望大牛们能多提意见。

对客户端的格式有些许要求,大致如下:

1.  ./chatClient  user:注册用户名(注册成功后会显示当前已在服务器注册的用户名称,不成功,按照“user:注册用户名”格式重新注册)

2.  To:用户名称 消息内容(用户名和消息内容之间空格不可少,回车键发送消息)

3.  To:all 消息内容(向所以注册客户端发送消息)

4.  quit+回车 退出客户端

一、服务器源代码代码

1.IoServiceThread.cpp

#include <iostream>
#include "IoServiceThread.h"

using namespace std;

CIoServiceThread::CIoServiceThread()
{
}

CIoServiceThread::~CIoServiceThread()
{
}

void CIoServiceThread::Start()
{
	cout<<"CIoServiceThread::Start()"<<endl;
    m_work=new boost::asio::io_service::work(m_ioService);
    m_thread=boost::thread(boost::bind(&boost::asio::io_service::run,&m_ioService)); 
}
void CIoServiceThread::Stop()
{
    delete m_work;
    m_thread.join();
    m_ioService.reset();
}

2. IoServiceManager.cpp

#include "IoServiceManager.h"
#include <iostream>

using namespace std;

CIoServiceManager* CIoServiceManager::sm_instance = NULL;

CIoServiceManager* CIoServiceManager::Instance()
{
    if(sm_instance==NULL)
        sm_instance=new CIoServiceManager;
    return sm_instance;
}

CIoServiceManager::CIoServiceManager()
	: ppThreads(NULL)
	, m_thread(0)
	, m_index(0)
	, m_running(false)
{
}

void CIoServiceManager::Start(int nThread)
{
	cout<<"CIoServiceManager::Start(), nThread = "<<nThread<<endl;
    boost::lock_guard<boost::mutex> guard(m_mut);
    if(m_running==false)
    {
        m_running=true;
        m_thread=nThread;
        ppThreads=new CIoServiceThread*[m_thread];
        for(int i=0;i<m_thread;i++)
        {
            CIoServiceThread* pThread = new  CIoServiceThread;
            ppThreads[i]=pThread;
            pThread->Start();
        }
    }
}

void CIoServiceManager::Stop()
{
    boost::lock_guard<boost::mutex> guard(m_mut);
    if(m_running)
    {
        m_running=false;
        for(int i=0;i<m_thread;i++)
        {
            CIoServiceThread* pThread=ppThreads[i];
            pThread->Stop();
            delete pThread;
        }
    }
}

boost::asio::io_service& CIoServiceManager::GetIoService()
{
	cout<<"CIoServiceManager::GetIoService()"<<endl;
    int i=(m_index++)%m_thread;
    CIoServiceThread * pThread=ppThreads[i];
    return pThread->GetIoService();
}

以上类主要是进行开启io多线程,每个线程执行io_service::run(). 待续...

boost::io_service解读

boost::io_service的队列模型、线程模型、源码解读。
  • ybxuwei
  • ybxuwei
  • 2016年11月26日 16:28
  • 2767

boost::asio::io_service与socket(C++)

boost::asio::io_serviceio_service类为下面的异步对象提供核心的I/O操作函数,主要用途还是用于socket编程 boost::asio::ip::tcp::socket...
  • u011073673
  • u011073673
  • 2016年11月10日 16:08
  • 1377

C++ 建立本地网络服务器 (Boost.Asio库)

详细的注释讲解利用Boost库建立服务器,最终自己也写了一个具有并发功能的boost服务器,可供直接调用。...
  • CSND_Ayo
  • CSND_Ayo
  • 2017年03月12日 05:37
  • 1802

利用Asio网络库建立自己的Socket服务器

  • 2017年03月21日 08:40
  • 21KB
  • 下载

使用boost ASIO库封装TCP服务器类

使用异步TCP方式,可在此基础上增加更多功能。 头文件AsioTcp.h: #pragma once #include #include #include typedef boost...
  • haoxingfeng
  • haoxingfeng
  • 2013年06月14日 14:07
  • 2868

整理socket编程<二>:boost::asio实现异步服务器

1.前言 前面文章已实现了调用win32 socket来实现同步服务器的开发,包括使用非阻塞模式+select I/O模型来实现非阻塞的服务器开发,本篇来介绍下boost::asio开源库来实现异步服...
  • wind_leep
  • wind_leep
  • 2016年01月19日 11:18
  • 1058

boost::asio server编程实例

// boost.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include ...
  • lanbingluyu
  • lanbingluyu
  • 2012年09月20日 23:58
  • 1051

利用boost:asio写的简单聊天服务器四

二、客户端源代码 1. ChatClient.cpp (客户端main) #include #include #include #include #include #include ...
  • hkm_best
  • hkm_best
  • 2013年12月05日 14:48
  • 641

利用boost:asio写的简单聊天服务器二

一、服务器端源代码 3. Connection.cpp  (每个客户端连接分别对应一个CConnection对象) #include "Connection.h" #include "Connec...
  • hkm_best
  • hkm_best
  • 2013年12月05日 14:40
  • 961

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

boost开发文档中实时聊天程序的客户端(加入了详细注释 方便理解)
  • cyg0810
  • cyg0810
  • 2014年07月01日 10:52
  • 13455
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用boost:asio写的简单聊天服务器一
举报原因:
原因补充:

(最多只允许输入30个字)