当前位置: 首页 > news >正文

(3)同步读写client和server

今天我们来实现一个最基础的 TCP 通信。
客户端:从终端读取一行输入,发送给服务端,再接收服务端回传的数据

服务端:监听指定端口,接收客户端连接,为每个连接创建一个线程,读取客户端消息并原样返回

一、整体通信流程

客户端流程

  1. 创建 io_context
  2. 构造服务端地址和端口对应的 endpoint
  3. 创建 socket
  4. 调用 connect() 连接服务端
  5. 从控制台读入用户输入
  6. 调用 write() 发送数据
  7. 调用 read() 接收服务端回传数据

服务端流程

  1. 创建 io_context
  2. 创建 acceptor 并绑定到 10086 端口
  3. 循环等待客户端连接
  4. 每接收一个客户端,就创建一个 socket
  5. 为该连接启动一个线程执行 session()
  6. 在线程中循环读取客户端数据
  7. 收到数据后原样写回,实现 Echo

二、客户端代码

#include<boost/asio.hpp>#include<iostream>usingnamespaceboost;constintMAX_LENGTH=1024;intmain(){try{//创建上下文服务asio::io_context ioc;//构造一个endpointasio::ip::tcp::endpointremote_ep(asio::ip::make_address("127.0.0.1"),10086);asio::ip::tcp::socketsock(ioc);system::error_code error=asio::error::host_not_found;sock.connect(remote_ep,error);if(error){std::cout<<"connect failed code is "<<error.value()<<"error msg is"<<error.message()<<std::endl;return0;}std::cout<<"Enter Message: ";charrequest[MAX_LENGTH];std::cin.getline(request,MAX_LENGTH);size_t request_length=strlen(request);asio::write(sock,asio::buffer(request,request_length));charreply[MAX_LENGTH];size_t reply_length=asio::read(sock,asio::buffer(reply,request_length));std::cout<<"Reply is : ";std::cout.write(reply,reply_length);std::cout<<"\n";}catch(system::system_error&e){std::cerr<<"Exception"<<e.what()<<std::endl;}}

三、服务端代码

#include<boost/asio.hpp>#include<iostream>#include<memory>#include<set>usingnamespaceboost;constintMAX_LENGTH=1024;usingsocket_ptr=std::shared_ptr<asio::ip::tcp::socket>;std::set<std::shared_ptr<std::thread>>thread_set;voidsession(socket_ptr sock){try{for(;;){chardata[MAX_LENGTH];memset(data,'\0',MAX_LENGTH);system::error_code error;//size_t length = asio::read(sock, asio::buffer(data, MAX_LENGTH), error);size_t length=sock->read_some(asio::buffer(data,MAX_LENGTH),error);if(error==asio::error::eof){std::cout<<"connection closed by peer"<<std::endl;break;}elseif(error){throwsystem::system_error(error);}std::cout<<"receive form "<<sock->remote_endpoint().address().to_string()<<std::endl;std::cout<<"receive message is "<<data<<std::endl;//回传给对方asio::write(*sock,asio::buffer(data,MAX_LENGTH));}}catch(system::system_error&e){std::cerr<<"error in thread: "<<e.what()<<"\n"<<std::endl;}return;}voidserver(asio::io_context&io_context,uint16_tport){asio::ip::tcp::acceptora(io_context,asio::ip::tcp::endpoint(asio::ip::tcp::v4(),port));for(;;){socket_ptrsocket(newasio::ip::tcp::socket(io_context));a.accept(*socket);autot=std::make_shared<std::thread>(session,socket);thread_set.insert(t);}}intmain(){try{asio::io_context ioc;server(ioc,10086);for(auto&t:thread_set){t->join();}}catch(system::system_error&e){std::cerr<<"error in thread: "<<e.what()<<"\n"<<std::endl;}return0;}
http://www.jsqmd.com/news/465998/

相关文章:

  • GM-CSF Surpass ELISA试剂盒如何助力解析病毒感染中的炎症风暴机制?
  • 2026年上海物联网应用开发报价多少?附性价比高的公司推荐
  • 2026年3月吉林水泥制品/水泥管/顶管/排水管/矩形槽厂家综合分析 - 2026年企业推荐榜
  • 使用内网穿透远程访问 OpenClaw:让本地大模型随时随地可用
  • IFN-γ Surpass ELISA试剂盒如何揭示剂量依赖性干扰素-γ对肿瘤干细胞的双重调控?
  • 豆包GEO优化怎么选?3家服务商实测,效果惊人!
  • 2026辽阳草坪绿化优质品牌推荐指南:辽阳草坪批发、辽阳草坪种植、辽阳草坪绿化、辽阳草坪苗木、辽阳草坪销售、辽阳草坪专用草选择指南 - 优质品牌商家
  • 基于springboot的桂林旅游景点导游平台的设计与实现项目源码 java毕设 免费分享
  • 2026重型包装苏州纸箱定制深度选型指南:3大主流方案的场景匹配路径 - 速递信息
  • 教育行业非结构化数据治理实战复盘与架构解析
  • IDEA 常用快捷键
  • 2026年中频石墨化炉公司推荐,哪家更靠谱 - 工业品牌热点
  • wps pdf应用程序的关联
  • 能源行业零信任安全架构实战解析与选型指南
  • IL-5 Surpass ELISA试剂盒如何助力过敏性疾病与寄生虫感染的机制研究?
  • 小公司初面---java后端题目
  • 三维KD-Tree实现算法
  • 2026年深圳资深房产纠纷律师排名,口碑好的律师大盘点 - myqiye
  • HCIP IS-IS 综合实验一
  • 2026年深圳、广州、佛山高性价比的Ai搜索优化企业排名Top10 - 工业推荐榜
  • 《算法竞赛从入门到国奖》算法基础:数据结构-单调队列
  • 别再直接 git push 了!这个“魔法“参数让你的代码质量翻倍
  • Java面向对象—JDBC外键和时间的处理
  • 抖音代运营公司如何选?这份参考指南请收好,小红书代运营/GEO优化/网络营销/网络推广/新闻发布,抖音代运营品牌怎么选择 - 品牌推荐师
  • 【AI】举例说明open claw运行原理
  • MySQL数据库 约束
  • 2026年婚恋服务优质机构推荐榜精准匹配有保障:附近有婚介所/女士征婚/婚介信息/婚介平台/婚介机构/婚恋公司/选择指南 - 优质品牌商家
  • 对所做的决策负责
  • Mysql--07
  • CH32V307 - USART串口收发文本数据详解(第九章)