首页 > 其他分享 >用Asio实现同步echo服务器

用Asio实现同步echo服务器

时间:2024-09-23 18:23:03浏览次数:6  
标签:Asio asio void echo std 服务器 include boost port

使用Asio实现同步echo服务器

服务端

sync_server.h

#ifndef  ASYNC_SERVER_H
#define	 ASYNC_SERVER_H
#include <boost/asio/ip/tcp.hpp>
#include <memory>
#include <set>
#include <thread>

namespace MS {
	
	typedef std::shared_ptr<boost::asio::ip::tcp::socket> socket_ptr;
	class AsyncServer {
	public:
			AsyncServer(unsigned short);
			~AsyncServer() {}
			void listen();
			void session(socket_ptr);
	private:
			unsigned short _port;
			boost::asio::ip::tcp::acceptor _acceptor;
			std::set<std::shared_ptr<std::thread>> _connect_thread; 
	private:
		void read_message();
		void send_message();
	};
}
#endif // ! ASYNC_SERVER_H

sync_client.cpp

#include <iostream>
#include <string>
#include <boost/asio/write.hpp>
#include <boost/asio/read.hpp>

#include "async_server.h"
boost::asio::io_context IOC;
namespace MS {
	using namespace std;
	using namespace boost::asio;
	#define MAX_SZIE 1024
	
	AsyncServer::AsyncServer(unsigned short port)
	:_port{port}, 
	 _acceptor{IOC, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), _port)}
	{
		std::cout << "the server initing." << std::endl;
		this->listen();
		std::cout << "the server is running." << std::endl;
	}

	void AsyncServer::listen() {
		while(1) {
			std::cout << "listen the connection...\n";
			socket_ptr sock_{new ip::tcp::socket(IOC)};
			this->_acceptor.accept(*sock_);
			std::cout << "new connection from " << sock_->remote_endpoint().address() << std::endl;
			char data[MAX_SZIE];
			boost::system::error_code ec;
			memset(data, '\0', MAX_SZIE);
			sock_->async_read_some(boost::asio::buffer(data, MAX_SZIE), ec);
			if (ec.value() != 0) {
				std::cerr << "the async read is falie: " << ec.value() 
					      << " message: " << ec.message() << std::endl;
			}
			cout.write(data, MAX_SZIE);
			sock_->async_write_some(boost::asio::buffer(data, MAX_SZIE),ec);
			if (ec.value() != 0) {
				std::cerr << "the async send is falie: " << ec.value()
						  << " message: " << ec.message() << std::endl;
			}
			//std::thread session_thread(MS::AsyncServer::session, this, sock_);
			/*std::thread session_thread([&]() {
				this->session(sock_);
				});*/
			//session_thread.join();
			//delete session_thread;
		}
	}

	void AsyncServer::session(socket_ptr socket) {
		for(;;){
			try{
				char data[MAX_SZIE];
				memset(data, '\0', MAX_SZIE);
				boost::system::error_code error;
				size_t send_length = socket->read_some(boost::asio::buffer(data, MAX_SZIE), error);

				if(error.value() != 0){
					cerr << "read message error,code is " << error.value() << ", message is " << error.message() << endl;
					return;
				}
				cout << "write message's length is : " << send_length << endl;
				cout.write(data, MAX_SZIE);
				socket->write_some(boost::asio::buffer(data), error);

				if(error.value() != 0){
					cerr << "write message error: " << error.message() << endl;
				}
			} catch(...){
				cout << "Client disconnected" << endl;
			}
		}	
	}

	void AsyncServer::send_message() {
		
	}

	void AsyncServer::read_message() {
		
	}
}

int main() {
	try{
		IOC.run();
		MS::AsyncServer server(10086);
	} catch(std::exception &e){
		std::cerr << "Exception: " << e.what() << std::endl;
	}
}

客户端

sync_client.h

#pragma once

#include <iostream>
#include <boost/asio/ip/tcp.hpp>

namespace MC {
	class Client {
	public:
		Client(const std::string&, unsigned short);
		void connect_to_server();
		void runClient();
		void send_message();
		void receive_message();
		
	private:
		boost::asio::ip::tcp::socket _sock;
		boost::asio::ip::tcp::endpoint _remote_endpoint;	
	};
}

sync_client.cpp


#include <iostream>
#include <boost/asio/write.hpp>
#include <boost/asio/read.hpp>

#include "async_client.h"

static boost::asio::io_context IOC;
namespace MC {
	using namespace std;
	using namespace boost::asio::ip;
	#define MAX_LENGTH 1024
	
	Client::Client(const std::string& host, unsigned short port)
		:_sock{IOC}, _remote_endpoint{ address::from_string(host), port }
	{
		
		this->connect_to_server();
		this->runClient();
	}

	// connect to the server by host and port
	void Client::connect_to_server() {
		try {
			boost::system::error_code ec = boost::asio::error::host_not_found;
			_sock.connect(_remote_endpoint, ec);

			if(ec.value() != 0) {
				std::cout << "connect failed, code is " << ec.value() << " error msg is " << ec.message() << std::endl;
				return;
			}
			std::cout << "connect success!" << std::endl;
			
		}catch(...) {
			std::cout << "connect failed! system error." << std::endl;
		}
	}

	// run the client
	void Client::runClient(){
		while(true) {
			this->send_message();
			this->receive_message();
		}
	}

	// send message to server
	void Client::send_message() {
		try {
			std::string msg;
			std::cout << "Enter message: ";
			std::getline(std::cin, msg);
			boost::asio::write(_sock, boost::asio::buffer(msg));
		}catch(...) {
			std::cout << "send message failed! system error." << std::endl;
		}
	}

	void Client::receive_message() {
		try {
			char reply[MAX_LENGTH];
			size_t reply_length = boost::asio::read(_sock,
				boost::asio::buffer(reply, MAX_LENGTH));
			std::cout << "Reply is: ";
			std::cout.write(reply, reply_length);
			std::cout << "\n";
		}catch(...) {
			std::cout << "receive message failed! system error." << std::endl;
		}
	}

	
}


int main() {
	MC::Client client("127.0.0.1", 10086);
	// client.runClient();
}

标签:Asio,asio,void,echo,std,服务器,include,boost,port
From: https://www.cnblogs.com/runtimeerror/p/18427617

相关文章

  • 一台服务器可以部署多个项目吗
    是的,一台服务器可以部署多个项目。这种做法在实际应用中非常普遍,尤其是在资源有限或者项目规模较小的情况下。以下是一些关于在单一服务器上部署多个项目的考虑点:1.虚拟主机使用虚拟主机可以在同一台物理服务器上运行多个独立的网站或应用。在Web服务器软件(如Apache、Nginx)中配置......
  • 弹性云服务器的功能有哪些
    弹性云服务器(ElasticCloudServer,ECS)是一种云计算服务,提供了多种功能以适应不同的业务需求。以下是弹性云服务器的主要功能:资源弹性伸缩:ECS可以根据实际需求自动调整CPU、内存等计算资源,实现资源的按需分配。丰富的实例类型:提供多种不同配置的实例类型,用户可以根据应用的具体需......
  • 买服务器跑代码是什么意思
    "买服务器跑代码"是指个人或组织购买一台服务器,并在上面部署和运行自己的软件代码,以提供特定的服务或执行某些计算任务。具体来说,这个过程通常涉及以下几个步骤:1.购买服务器根据需求选择合适的服务器硬件,可以直接购买物理服务器,也可以租用云服务器。选择时要考虑服务器的CPU、内存......
  • 服务器数据库mysql error错误怎么解决
    解决MySQL错误通常需要根据具体的错误信息来定位问题并采取相应的措施。下面是一些常见的解决步骤,可以帮助你处理服务器数据库中的MySQL错误:查看错误日志:检查MySQL的错误日志文件,通常位于/var/log/mysql/error.log(Linux)或C:\ProgramData\MySQL\MySQLServer5.7\data\error.l......
  • 统信服务器操作系统【SSH登录常见问题】解决方案
    方案适用于统信服务器操作系统D/E/A版。文章目录前言问题及解决方案问题一问题现象问题原因问题方案问题二问题现象问题原因问题方案问题三问题原因问题方案问题四问题现象问题原因问题方案问题五问题现象问题原因问题方案......
  • 带你0到1之QT编程:十七、Http协议实战,实现一个简单服务器和一个客户端进行http协议通信
    此为QT编程的第十七谈!关注我,带你快速学习QT编程的学习路线!每一篇的技术点都是很很重要!很重要!很重要!但不冗余!我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点!码农不易,各位学者学到东西请点赞支持支持!开始部分:总:此次实战主要是模拟一个http协议进行网络通信的一......
  • 邮件发送基础:深入SMTP协议、配置邮件服务器及Python实现
    目录引言SMTP协议基础定义与功能工作原理特性与优势邮件服务器配置第三方邮件服务商配置自建邮件服务器配置使用Python发送邮件安装smtplib和email模块发送简单纯文本邮件发送HTML格式邮件发送带附件的邮件完整示例:发送带附件的HTML邮件注意事项总结引言......
  • 阿里云mysql数据库服务器错误怎么回事
    阿里云MySQL数据库服务器错误可能由多种因素造成,以下是一些常见的原因及解决方法:网络配置错误:检查服务器的网络配置,确保防火墙设置允许来自客户端的连接请求。确认IP地址或域名解析正确,且客户端能够通过网络访问到数据库服务器。MySQL服务未启动:确认MySQL服务已经在阿......
  • 高颜值!一款基于 Flutter 开发的 Linux 服务器工具箱
    大家好,我是Java陈序员。今天,给大家介绍一款高颜值的基于Flutter开发的Linux服务器工具箱。关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍flutter_server_box——一款使用Flutter开发的Linux服务器工具箱,提......
  • 如何查杀网站(服务器)空间木马
    为了确保网站的安全性和完整性,按照您提供的步骤进行操作是非常必要的。以下是详细的步骤说明,请务必按照顺序逐步操作,并确保每一步都正确无误。1.备份网站数据库与源码文件在进行任何操作前,请先备份网站的数据库和源码文件。这一步非常重要,以防万一出现问题时可以恢复数据。2.......