您的位置:首页 > 其它

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

2013-12-05 14:34 441 查看
前几天接到老大一个学习实践任务——编写简单的聊天服务器,我对网络编程和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(). 待续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: