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

#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>

namespace ChatTest
{
	class chat_message
	{
	public:
		enum {header_length = 4, max_body_length = 1024};
	public:
		chat_message() : body_length_(0) {}

		size_t length() const
		{
			return header_length + body_length_;
		}

		void body_length(size_t new_length)
		{
			body_length_ = new_length;
			if (body_length_ > max_body_length)
				body_length_ = max_body_length;
		}

		size_t body_length() const
		{
			return body_length_;
		}

		char* data()
		{
			return data_;
		}

		const char* data() const
		{
			return data_;
		}

		char* body()
		{
			return data_ + header_length;
		}

		const char* body() const
		{
			return data_ + header_length;
		}

		bool encode_header()
		{
			char header[header_length+1] = "";
			sprintf(header, "%4d", body_length_);
			memcpy(data_, header, header_length);
			return true;
		}
		
		bool decode_header()
		{
			char header[header_length + 1] = "";
			strncat(header, data_, header_length);
			body_length_ = atoi(header);
			std::cout << body_length_ << std::endl;
			if (body_length_ > max_body_length)
			{
				body_length_ = 0;
				return false;
			}
			return true;
		}

	private:
		char data_[header_length + max_body_length];
		size_t body_length_;
	};

}


#pragma once
#include <deque>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include "my_chat_message.h"

namespace ChatTest
{
	using namespace boost::asio::ip;
	typedef std::deque<chat_message> chat_message_queue;

	class chat_client
	{
	public:
		chat_client(boost::asio::io_service& io, tcp::resolver::iterator endpoint_iterator)
			:io_service_(io), socket_(io)
		{
			start_connect(endpoint_iterator);
		}

		void start_connect(tcp::resolver::iterator endpoint_iterator)
		{
			boost::asio::async_connect(socket_, 
				endpoint_iterator,
				boost::bind(&chat_client::hand_connect, this, boost::asio::placeholders::error));
		}

		void write(const chat_message& msg)//投入到队列中去
		{
			io_service_.post(boost::bind(&chat_client::do_write, this, msg));
		}

		void close()
		{
			io_service_.post(boost::bind(&chat_client::do_close, this));
		}

	private:
		void hand_connect(const boost::system::error_code& error)
		{
			if (!error)
			{
				boost::asio::async_read(socket_, 
					boost::asio::buffer(read_msg_.data(), chat_message::header_length),
					boost::bind(&chat_client::hand_read_header, this, boost::asio::placeholders::error));
			}
			else 
			{
				//std::cout << "connect error\n" << std::endl;
			}
		}

		void hand_read_header(const boost::system::error_code& error)
		{
			if (!error && read_msg_.decode_header())
			{
				std::cout.write(read_msg_.data(), chat_message::header_length);
				//std::cout << "\nheader\n" << read_msg_.body_length() << std::endl;
				boost::asio::async_read(socket_, 
					boost::asio::buffer(read_msg_.body(), read_msg_.body_length()/*chat_message::max_body_length长度大于实际长度时会出做*/),
					boost::bind(&chat_client::hand_read_body, this, boost::asio::placeholders::error));
			}
			el
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值