折腾了一上午,看到这个结果的时候泪目了兄弟闷,讲真。我的asio客户端成功收到服务端发来的消息了。虽然这确实是极其智障又简单的入门哈哈
- 下载独立版本 asio网络通信库
- 新建cmake工程,CMakeLists.txt加载asio
- 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()
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;}
客户端代码
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;}
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 0asio::io_context io;asio::steady_timer t(io, asio::chrono::seconds(5));t.async_wait(&print);std::cout << "hh" << std::endl;io.run();
#endifstd::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;
}
VS的cmake项目小技巧
可以对项目右键点击选择右键菜单“在终端中打开”,打开终端,输入命令开启服务端或客户端。如果是开发网络通信小Demo,服务端和客户端放在一个工程中,通过终端输入命令参数,选择开启服务器或客户端比新建两个VS工程要简单方便些,铁汁闷。