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

原创 2013年12月05日 14:48:56

二、客户端源代码

1. ChatClient.cpp (客户端main)

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/array.hpp>
#include <boost/thread.hpp>

using namespace boost::asio::ip;
using namespace std;


class CClient
{
public:
	CClient(boost::asio::io_service& ios, const string& addr, unsigned port, const string& argv1)
		: m_socket(ios)
	{
		boost::asio::ip::tcp::endpoint endp(boost::asio::ip::address_v4::from_string(addr), port);

		m_socket.async_connect(endp, boost::bind(&CClient::handleConnect, this,
			boost::asio::placeholders::error, argv1));
	}

	void Write(const string& msg)
	{
		//cout << __FUNCTION__ <<endl;
		m_socket.get_io_service().post(boost::bind(&CClient::doWrite, this, msg));
	}
	
	void Close()
	{	
		m_socket.get_io_service().post(boost::bind(&CClient::doClose, this));
	}
	
private:

	void handleConnect(const boost::system::error_code& err, const string& registerName)
	{
		//cout << "CClient::handleConnect()" <<endl;		
		if (!err)
		{
			boost::asio::async_write(m_socket,boost::asio::buffer(registerName), 
				boost::bind(&CClient::handleWrite, this, boost::asio::placeholders::error));
		}
		else
		{
			std::cout << "handleConnect Error: " << err.message() << "\n";
			doClose();
		}
	}

	void handleWrite(const boost::system::error_code& err)
	{
		//cout << "CClient::handleWrite()" << endl;
		clearBuf();
		if (!err)
		{
			m_socket.async_read_some(boost::asio::buffer(m_rspBuffer),
				boost::bind(&CClient::handleRead,this,	
					boost::asio::placeholders::error,
					boost::asio::placeholders::bytes_transferred));
		}
		else
		{
			doClose();
			std::cout << "handleWrite Error: " << err.message() << "\n";
		}
	}

	void handleRead(const boost::system::error_code& err, int size)
	{
		//cout << "CClient::handleRead()" <<endl;
		
		if (!err)
		{
			string data(m_rspBuffer.data(), size);			
			if(strcmp(data.c_str(),"test"))
			{
				std::cout << data << std::endl;
			}
			clearBuf();
			m_socket.async_read_some(boost::asio::buffer(m_rspBuffer),
				boost::bind(&CClient::handleRead,this,	
					boost::asio::placeholders::error,
					boost::asio::placeholders::bytes_transferred));
		}
		else
		{
			std::cout << "handleRead Error: " << err.message() << "\n";
			doClose();
		}
	}
	
	void clearBuf()
	{
		boost::lock_guard<boost::mutex> guard(m_mut);
		int size = m_rspBuffer.size();
		if(size != 0)
		{
			for(int i=0; i<size; i++)
			{
				m_rspBuffer[i] = '\0';
			}
		}
	}
	
	void doWrite(const string& msg)
	{
		//cout << "CClient::doWrite()" <<endl;
		boost::asio::async_write(m_socket,boost::asio::buffer(msg), 
				boost::bind(&CClient::handleDoWrite, this, boost::asio::placeholders::error));
	}
	
	void handleDoWrite(const boost::system::error_code& err)
	{
		//cout << "CClient::handleDoWrite()" <<endl;
		if(err)
		{
			std::cout << "handleDoWrite Error: " << err.message() << "\n";
			doClose();
		}
	}
	
	void doClose()
	{
		m_socket.close();
	}

private:
	boost::array<char, 8192> m_rspBuffer;
	tcp::socket m_socket;

	boost::mutex m_mut;
};

int main(int argc, char* argv[])
{
	try
	{
		if(2!=argc)
		{
			std::cerr << "Usage: ./chatClient user:reigster_name\n";
			return 1;
		}
	
		boost::asio::io_service ios;
		CClient client(ios, "10.241.37.35", 9494, argv[1]);
		boost::thread bThead(boost::bind(&boost::asio::io_service::run, &ios));
		string strData;
		while(getline(cin, strData))
		{
			if(!strcmp(strData.c_str(),"quit"))
				break;
			client.Write(strData);
		}
		client.Close();
		bThead.join();
	}
	catch (std::exception& e)
	{
		std::cerr << "Exception: " << e.what() << "\n";
	}
	return 0;
}


功能较为简单,也有很多问题,希望各位能多提宝贵意见和建议。

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

boost开发文档中实时聊天程序的客户端(加入了详细注释 方便理解)
  • cyg0810
  • cyg0810
  • 2014年07月01日 10:52
  • 13245

boost asio异步读写网络聊天室【官方示例】

// // chat_message.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2010 Christopher M. Kohlhoff (ch...
  • u013470115
  • u013470115
  • 2014年12月20日 14:50
  • 1728

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

一、服务器端源代码 5. Server.cpp  (侦听端口,接收连接,创建新CCnection) #include "Server.h" #include "ConnectionManager....
  • hkm_best
  • hkm_best
  • 2013年12月05日 14:46
  • 767

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

前几天接到老大一个学习实践任务——编写简单的聊天服务器,我对网络编程和boost库不太熟悉,临时抱佛脚写了一个服务端和测试客户端,进过测试可以完成聊天的基本功能,但是还有很多不足,比如客户端输入消息的...
  • hkm_best
  • hkm_best
  • 2013年12月05日 14:34
  • 1577

Boost.Asio入门(CSDN也有Markdown了,好开森)

首先,让我们先来了解一下什么是Boost.Asio?怎么编译它?了解的过程中我们会给出一些例子。然后在发现Boost.Asio不仅仅是一个网络库的同时你也会接触到Boost.Asio中最核心的类——*...
  • mmoaay
  • mmoaay
  • 2016年03月03日 08:45
  • 6994

Boost.Asio的使用技巧

基本概念 Asio proactor I/O服务 work类run() vs poll()stop()post() vs dispatch()buffer类缓冲区管理 I/O对象 ...
  • somestill
  • somestill
  • 2016年08月21日 19:01
  • 2231

Boost.Asio的使用技巧

基本概念 Asio proactor I/O服务 work类run() vs poll()stop()post() vs dispatch()buffer类缓冲区管理 I/O对象 ...
  • educast
  • educast
  • 2013年10月27日 22:14
  • 10886

boost asio异步读写网络聊天室【官方示例】

// // chat_message.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2010 Christopher M. Kohlhoff (ch...
  • u013470115
  • u013470115
  • 2014年12月20日 14:50
  • 1728

Boost.asio实现的同步、异步TCP通信的简单例子

每个asio程序都必须有io_server对象。对于服务端和客户端都需要socket对象,通过socket对象的成员函数进行连接和数据通信。服务端需要 acceptor对象来等待连接。下面的例子是用C...
  • zhongjiezheng
  • zhongjiezheng
  • 2015年03月19日 23:13
  • 2860

boost::asio编写的异步服务器和客户端

客户端 #include #include #include #include #include #include #include #include #include #include ...
  • qq_31558353
  • qq_31558353
  • 2016年03月14日 16:22
  • 3016
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用boost:asio写的简单聊天服务器四
举报原因:
原因补充:

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