利用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写的简单聊天服务器三

一、服务器端源代码 5. Server.cpp  (侦听端口,接收连接,创建新CCnection) #include "Server.h" #include "ConnectionManager....

Muduo 网络编程示例之二:Boost.Asio 的聊天服务器

这是《Muduo 网络编程示例》系列的第二篇文章。 本文讲介绍一个与 Boost.Asio 的示例代码中的聊天服务器功能类似的网络服务程序,包括客户端与服务端的 muduo 实现。这个例子的主要目的是...
  • Solstice
  • Solstice
  • 2011年02月04日 08:58
  • 18706

boost::asio学习之[六]简单聊天程序

#pragma once #include #include #include namespace ChatTest { class chat_message { public: e...

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

// // chat_message.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2010 Christopher M. Kohlhoff (ch...

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

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

Boost.Asio学习之简单的HTTP服务器

Boost.asio实现简单的HTTP服务器

简单的Boost::asio 高性能C/S服务器模型

Boost::Asio 在底层封装的了操作系统的高效I/O模型。实现了很高的并发量和吞吐量。其中操作系统主要实现了两种I/O模型Reactor和Proactor。 接下来探讨一下两种I/O多路复用模...

使用Boost.Asio写的多线程TCP转发代理服务器

http://www.cppblog.com/archiveman/archive/2010/03/05/108971.html 应用场景是这样的: 客户端和服务器在不同的网段内,它们之间...

boost asio中转服务器(TCP)

  • 2013年06月14日 14:37
  • 8KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用boost:asio写的简单聊天服务器四
举报原因:
原因补充:

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