当前位置:   article > 正文

消息中间件 Asio (C++)_asio服务端代码

asio服务端代码

在这里插入图片描述
折腾了一上午,看到这个结果的时候泪目了兄弟闷,讲真。我的asio客户端成功收到服务端发来的消息了。虽然这确实是极其智障又简单的入门哈哈

  1. 下载独立版本 asio网络通信库
  2. 新建cmake工程,CMakeLists.txt加载asio
  3. asio最简单的服务端和客户端代码编写

下载独立版本 asio网络通信库

链接:https://pan.baidu.com/s/1T3aUf3yZbn0nTGi19_RqYA
提取码:1234

文件7zip压缩包,下载用7zip解压,就是一个asio文件夹,里面包含了asio所有头文件源码。独立版的asio是header-only,所以使用时只需包含头文件即可。把解压得到的asio文件夹放到项目目录里。

新建cmake工程,CMakeLists.txt加载asio

VS新建CMake工程或VSCode新建CMake工程都可以。编写CMakeLists.txt将下载解压的asio文件夹添加到头文件搜索目录里,用工程main函数将服务端和客户端的源码文件链接生成可执行文件即可。
在这里插入图片描述
CMakeLists.txt源码

# CMakeList.txt: CMakeProject1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

project ("CMakeProject1")

## 威力很大
include_directories(/asio)


# 将源代码添加到此项目的可执行文件。
add_executable (CMakeProject1  CMakeProject1.cpp CMakeProject1.h)

if (CMAKE_VERSION VERSION_GREATER 3.12)
  set_property(TARGET CMakeProject1 PROPERTY CXX_STANDARD 20)
endif()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

asio最简单的服务端和客户端代码编写

asio简单的服务端和客户端的代码网上一搜一帕拉,也可参照以下代码编写。
服务端代码

		try
		{
			asio::io_service io_service;
			tcp::acceptor acceptor(io_service, tcp::endpoint(asio::ip::address::from_string("127.0.0.1"), 2121));

			for (;;)
			{
				tcp::socket socket(io_service);
				acceptor.accept(socket);

				asio::write(socket, asio::buffer(std::string("欢迎来到 Asio的世界! 我们一起愉快地探索下去吧!")));
			}
		}
		catch (std::exception& e)
		{
			std::cerr << e.what() << std::endl;
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

客户端代码

		try
		{
			asio::io_service io_service;
			tcp::resolver resolver(io_service);
			tcp::resolver::query query("127.0.0.1", "2121");
			tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

			tcp::endpoint endpoint = *endpoint_iterator;
			std::cout << endpoint << "\n\n";

			tcp::socket socket(io_service);

			asio::connect(socket, endpoint_iterator);

			for (;;)
			{
				array<char, 128> buf;
				buf.fill('\0');

				size_t len = socket.read_some(asio::buffer(buf));

				std::cout << buf.data() << std::endl;

			}
		}
		catch (std::exception& e)
		{
			std::cerr << e.what() << std::endl;
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

CMakeProject1.cpp 完整源文件

// CMakeProject1.cpp: 定义应用程序的入口点。
//

#include "CMakeProject1.h"

using namespace std;

#include "./asio/asio.hpp"

using asio::ip::tcp;
#include <ctime> 
#include <iostream> 
#include <string> 
#include <iostream> 


int main(int argc, char* argv[])
{

#if 0
	asio::io_context io;
	asio::steady_timer t(io, asio::chrono::seconds(5));
	t.async_wait(&print);
	std::cout << "hh" << std::endl;
	io.run();
#endif

	std::string input;
	std::cin >> input;

	if (input.compare("server") == 0)
	{
		try
		{
			asio::io_service io_service;
			tcp::acceptor acceptor(io_service, tcp::endpoint(asio::ip::address::from_string("127.0.0.1"), 2121));

			for (;;)
			{
				tcp::socket socket(io_service);
				acceptor.accept(socket);

				asio::write(socket, asio::buffer(std::string("欢迎来到 Asio的世界! 我们一起愉快地探索下去吧!")));
			}
		}
		catch (std::exception& e)
		{
			std::cerr << e.what() << std::endl;
		}

	}
	else if(input.compare("client") == 0)
	{
		try
		{
			asio::io_service io_service;
			tcp::resolver resolver(io_service);
			tcp::resolver::query query("127.0.0.1", "2121");
			tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

			tcp::endpoint endpoint = *endpoint_iterator;
			std::cout << endpoint << "\n\n";

			tcp::socket socket(io_service);

			asio::connect(socket, endpoint_iterator);

			for (;;)
			{
				array<char, 128> buf;
				buf.fill('\0');

				size_t len = socket.read_some(asio::buffer(buf));

				std::cout << buf.data() << std::endl;

			}
		}
		catch (std::exception& e)
		{
			std::cerr << e.what() << std::endl;
		}

		std::cout << "\n\n";
	}


	return 0;
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91

VS的cmake项目小技巧
可以对项目右键点击选择右键菜单“在终端中打开”,打开终端,输入命令开启服务端或客户端。如果是开发网络通信小Demo,服务端和客户端放在一个工程中,通过终端输入命令参数,选择开启服务器或客户端比新建两个VS工程要简单方便些,铁汁闷。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/357722
推荐阅读
相关标签
  

闽ICP备14008679号