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

muduo库搭建客户端

muduo库搭建客户端

#include "include/muduo/net/TcpClient.h"
#include "include/muduo/net/EventLoopThread.h"
#include "include/muduo/net/TcpConnection.h"
#include "include/muduo/base/CountDownLatch.h"
#include <iostream>
#include <functional>class TranslateClient
{public:TranslateClient(const std::string&sip,int sport):_latch(1),_client(_loopthread.startLoop(),muduo::net::InetAddress(sip,sport),"Translate"){_client.setConnectionCallback(std::bind(&TranslateClient::onConnection,this,std::placeholders::_1));_client.setMessageCallback(std::bind(&TranslateClient::onMessage,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));}//连接服务器,需要进行阻塞等待连接建立成功之后再进行返回void connect(){_client.connect();//阻塞等待_latch.wait();}bool send(const std::string&msg){if(_conn->connected()){_conn->send(msg);return true;}return false;}private: //连接建立成功时候的回调函数,建立成功的时候,唤醒上面的阻塞void onConnection(const muduo::net::TcpConnectionPtr&conn){if(conn->connected()){_latch.countDown();_conn=conn;}else{//连接操作关闭_conn.reset();}}//收到消息时候的回调函数void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp){std::cout<<"翻译结果为:"<<buf->retrieveAllAsString()<<std::endl;}private:muduo::CountDownLatch _latch;muduo::net::EventLoopThread _loopthread;muduo::net::TcpClient _client;muduo::net::TcpConnectionPtr _conn;
};int main()
{TranslateClient client("127.0.0.1",8085);client.connect();while(1){std::string buf;std::cin>>buf;client.send(buf);}return 0;
}

这段代码实现了一个基于 Muduo 网络库TCP 翻译客户端,用于与之前分析的 TranslateServer 服务器进行交互。以下是代码的详细解析:


核心功能

  1. 连接服务器:客户端连接到指定 IP 和端口(如 127.0.0.1:8085)。
  2. 发送翻译请求:用户输入英文单词或中文短语,客户端发送给服务器。
  3. 接收翻译结果:服务器返回翻译结果后,客户端打印到终端。

关键组件与逻辑

1. TranslateClient
  • 构造函数: 初始化 TcpClient,绑定到服务器地址(sip:sport)。 设置连接回调(onConnection)和消息回调(onMessage)。
  • 成员变量_latchCountDownLatch 用于阻塞等待连接建立(同步机制)。 _loopthread:事件循环线程,处理网络 I/O。 _client:TCP 客户端对象。 _conn:保存当前有效的连接对象。
2. 连接管理
  • connect() 方法: 调用 _client.connect() 发起连接。 通过 _latch.wait() 阻塞,直到连接成功(onConnection 中调用 _latch.countDown() 解除阻塞)。
  • onConnection 回调: 连接成功时,保存 TcpConnectionPtr_conn,并解除阻塞。 连接断开时,重置 _conn
3. 消息处理
  • send() 方法: 检查连接状态后,发送用户输入的消息到服务器。
  • onMessage 回调: 收到服务器响应时,打印翻译结果(buf->retrieveAllAsString())。
4. 主函数 main
  • 创建客户端对象,连接到本地服务器(127.0.0.1:8085)。

  • 进入循环,等待用户输入并发送到服务器:

    while (1) {std::string buf;std::cin >> buf;  // 用户输入(如 "hello")client.send(buf); // 发送到服务器
    }
    

工作流程

  1. 启动客户端

    ./dict_client
    
  2. 用户交互: 输入 hello → 客户端发送到服务器。 服务器返回 你好 → 客户端打印 翻译结果为: 你好

  3. 持续通信:循环等待用户输入,直到手动终止(Ctrl+C)。


技术亮点

  1. 同步连接等待: 使用 CountDownLatch 确保连接建立后再进行后续操作,避免竞态条件。
  2. 事件驱动EventLoopThread 处理网络 I/O,非阻塞且高效。
  3. 线程安全: 通过 TcpConnectionPtr 管理连接生命周期,避免悬空指针。

潜在改进

  1. 输入处理: 当前 std::cin 会忽略空格,建议改用 std::getline 支持带空格的短语(如 "thank you")。
  2. 错误处理: 添加连接失败或发送失败时的错误提示(如服务器未启动)。
  3. 退出机制: 支持输入特定命令(如 exit)主动断开连接。

总结

这段代码是一个典型的 异步TCP客户端 实现,展示了如何通过 Muduo 库实现:

  • 非阻塞连接建立
  • 消息收发
  • 事件回调机制

与之前分析的 TranslateServer 配合,即可构建完整的 C/S 架构翻译系统


文章转载自:

http://ixThpqO2.tjkth.cn
http://7g5llfgs.tjkth.cn
http://ucso4z0j.tjkth.cn
http://hyF8UJxD.tjkth.cn
http://g4HWsAGI.tjkth.cn
http://ZcedtJSl.tjkth.cn
http://3qYhT0Og.tjkth.cn
http://VNozrGCX.tjkth.cn
http://EsOVNsIj.tjkth.cn
http://os76Hcnw.tjkth.cn
http://8X3Xbpbm.tjkth.cn
http://AtY4zBwm.tjkth.cn
http://E0xdaIh8.tjkth.cn
http://fowZw9F6.tjkth.cn
http://pjoecC02.tjkth.cn
http://ATqIhBPF.tjkth.cn
http://eFWRP75c.tjkth.cn
http://gG8okrNn.tjkth.cn
http://ZmAFYd6C.tjkth.cn
http://FDmtkVaw.tjkth.cn
http://1j7tjqaD.tjkth.cn
http://0hfGFSDD.tjkth.cn
http://4NvO48lZ.tjkth.cn
http://3gzrxMBj.tjkth.cn
http://HKbJykg1.tjkth.cn
http://x4w8aGRs.tjkth.cn
http://Apg5mQeS.tjkth.cn
http://6ahj7jdA.tjkth.cn
http://KlfE2Cfh.tjkth.cn
http://VlEAsW5a.tjkth.cn
http://www.dtcms.com/a/372059.html

相关文章:

  • smpp3.4 协议
  • 阿里云高可用生产环境网络架构实战:VPC规划与多可用区部署
  • 中国移动中兴云电脑W132D-RK3528-2+32G-刷机固件包(非原机制作)
  • 疯狂星期四文案网第63天运营日记
  • 【PCIe EP 设备入门学习专栏 -- 8.2 PCIe EP 寄存器配置空间介绍】
  • Android开发-按钮触控
  • RocketMQ分布式消息中间件的核心原理与应用
  • MySQL 之 InnoDB 存储架构解析
  • 【LeetCode - 每日1题】构造和为0的n个不同整数数组
  • 使用MobaXterm连接Ubuntu时connection refused解决方法
  • Windows 内存整理和优化工具 - Wise Memory Optimize
  • VuePress 与 VitePress 深度对比:特性、差异与选型指南
  • Dockerfile文件常用配置详解
  • Logstash常用插件-ES集群加密
  • NT路径指的是什么?
  • AutoHotkey将脚本编译为exe文件
  • 【Java笔记】单例模式
  • 腕部骨折X光检测识别数据集:2w+图像,6类,yolo标注
  • 当没办法实现从win复制东西到Linux虚拟机时的解决办法
  • AI话术—知识库多次返回播放不同的内容(智能呼叫系统)
  • 【系统架构设计(20)】构件与中间件技术
  • 使用Terraform管理阿里云基础设施
  • 【01】针对开源收银系统icepos (宝塔面板) 详细安装教程详细参考-优雅草卓伊凡
  • python中的“与或非“与vue中的“与或非“
  • c6-类和对象-对象特征-类对象做对象成员
  • 云服务扫盲笔记(2) —— SLS 接入与设置自动化
  • 【算法--链表】109.有序链表转换二叉搜索树--通俗讲解
  • Java 网络编程学习笔记
  • kerberos详解
  • 【数据结构基础习题】-1- 数据结构基本操作