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

来源:互联网 发布:手机淘宝淘口令怎么用 编辑:程序博客网 时间:2024/06/11 05:03

前几天接到老大一个学习实践任务——编写简单的聊天服务器,我对网络编程和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(). 待续...

原创粉丝点击