折腾了一上午,看到这个结果的时候泪目了兄弟闷,讲真。我的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 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;
}
VS的cmake项目小技巧
可以对项目右键点击选择右键菜单“在终端中打开”,打开终端,输入命令开启服务端或客户端。如果是开发网络通信小Demo,服务端和客户端放在一个工程中,通过终端输入命令参数,选择开启服务器或客户端比新建两个VS工程要简单方便些,铁汁闷。