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

二、客户端源代码

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;
}


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值