1.Qt中TCP客户端编程

  • 对Qt编程而言,网络只是数据传输的通道
  • Qt提供了QTcpSocket类(封装了TCP协议细节);
  • 将QTcpSocket的对象当做黑盒使用,进行数据首发。

1.1QTcpSocket类的继承

1.2QTcpSocket的使用

  1. 连接服务器主机(connectToHost())
  2. 发送数据/接受数据(write()/read())
  3. 关闭连接(close())

1.3QTcpSocket的注意事项

  • 默认情况下,QTcpSocket使用异步编程的方式

    • 操作完成后立即返回(返回只代表的操作开始,不代表操作的结果,类似C语言中的回调函数以及Qt中的信号和槽机制)
    • 通过发送信号的方式返回操作的结果

2.QTcpSocket同步编程

2.1QTcpSocket提供辅助函数可完成同步编程的方式(返回值代表返回结果,平时编程使用的大多是同步编程的方式)

  1. - waitForConnected()/waitForDisconnected()
  2. - waitForBytesWritten()/waitForReadyRead()

2.2QTcpSocket同步编程流程

调用完功能函数(如connectToHost)立刻调用对应的同步辅助函数即实现同步编程

2.3QTcpSocket同步编程代码

代码运行时需启动socket的服务程序模拟tcp服务端

  1. #include "clientdemo.h"
  2. #include <QtGui/QApplication>
  3. #include <QTcpSocket>
  4. #include <QDebug>
  5. void SyncClientDemo()
  6. {
  7. QTcpSocket client;
  8. char buf[256] = {0};
  9. client.connectToHost("127.0.0.1", 8080);
  10. qDebug() << "Connected:" << client.waitForConnected();
  11. qDebug() << "Send Bytes:" << client.write("D.T.Software");
  12. qDebug() << "Send Status:" << client.waitForBytesWritten();
  13. qDebug() << "Data Available:" << client.waitForReadyRead();
  14. qDebug() << "Received Bytes:" << client.read(buf, sizeof(buf)-1);
  15. qDebug() << "Received Data:" << buf;
  16. client.close();
  17. // client.waitForDisconnected();
  18. }
  19. int main(int argc, char *argv[])
  20. {
  21. QApplication a(argc, argv);
  22. SyncClientDemo();
  23. //ClientDemo w;
  24. //w.show();
  25. return a.exec();
  26. }

结果

3.QTcpSocket异步编程

3.1 QTcpSocket的异步编程

  • QTcpSocket的对象通过发送信号的方式返回操作结果
  • 可以在程序中将对应的信号连接到槽函数,获取结果
  • 在GUI应用程序中通常使用QTcpSocket的异步编程方式

3.2QTcpSocket中的关键信号

  • connected():成功连接远端主机
  • disconnected:远程主机断开连接
  • readyRead():远端主机数据到达本机
  • bytesWritten(qint64):数据成功发送至系统(OS)

3.3编程实践

clientdemo.h

  1. #ifndef CLIENTDEMO_H
  2. #define CLIENTDEMO_H
  3. #include <QObject>
  4. //#include "ui_clientdemo.h"
  5. #include <QTcpSocket>
  6. class ClientDemo : public QObject
  7. {
  8. Q_OBJECT
  9. QTcpSocket m_client;
  10. protected slots:
  11. void onConnected();
  12. void onDisconnected();
  13. void onDataReady();
  14. void onBytesWritten(qint64 bytes);
  15. public:
  16. qint64 send(const char* data, int len);
  17. qint64 available();//得到到达本机的数据长度
  18. ClientDemo(QObject *parent = NULL);
  19. void connectToHost(QString ip,int port);
  20. void close();
  21. ~ClientDemo();
  22. private:
  23. // Ui::ClientDemoClass ui;
  24. };
  25. #endif // CLIENTDEMO_H

clientdemo.cpp

  1. #include "clientdemo.h"
  2. #include <QDebug>
  3. ClientDemo::ClientDemo(QObject *parent): QObject(parent)
  4. {
  5. //ui.setupUi(this);
  6. connect(&m_client, SIGNAL(connected()), this, SLOT(onConnected()) );
  7. connect(&m_client, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
  8. connect(&m_client, SIGNAL(readyRead()), this, SLOT(onDataReady()));
  9. connect(&m_client, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
  10. }
  11. void ClientDemo::onConnected()
  12. {
  13. qDebug() << "onConnected";
  14. qDebug() << "Local Address:" ;//<< m_client.localAddress();
  15. qDebug() << "Local Port:" << m_client.localPort();
  16. }
  17. void ClientDemo::onDisconnected()
  18. {
  19. qDebug() << "onDisconnected";
  20. }
  21. void ClientDemo::onDataReady()
  22. {
  23. char buf[256] = {0};
  24. qDebug() << "onDataReady:" << m_client.read(buf, sizeof(buf)-1);
  25. qDebug() << "Data:" << buf;
  26. }
  27. void ClientDemo::onBytesWritten(qint64 bytes)
  28. {
  29. qDebug() << "onBytesWritten:" << bytes;
  30. }
  31. void ClientDemo::connectToHost(QString ip,int port)
  32. {
  33. m_client.connectToHost(ip, port);
  34. }
  35. qint64 ClientDemo::send(const char* data, int len)
  36. {
  37. return m_client.write(data, len);
  38. }
  39. qint64 ClientDemo::available()
  40. {
  41. return m_client.bytesAvailable();
  42. }
  43. void ClientDemo::close()
  44. {
  45. m_client.close();
  46. }
  47. ClientDemo::~ClientDemo()
  48. {
  49. }

main.cpp

  1. #include "clientdemo.h"
  2. #include <QtGui/QApplication>
  3. #include <QTcpSocket>
  4. #include <QDebug>
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication a(argc, argv);
  8. //SyncClientDemo();
  9. ClientDemo w;
  10. w.connectToHost("127.0.0.1",8080);
  11. char buf[]="abc";
  12. w.send(buf,sizeof(buf)-1);
  13. //w.show();
  14. return a.exec();
  15. }

结果



4.小结

  • Qt提供了QTcpSocket类,其对象可用于收发TCP数据
  • QTcpSocket默认使用异步编程方式
  • QTcpSocket提供辅助函数用于完成同步编程的方式
  • GUI应用程序通常使用QTcpSocket的异步编程方式

TCP 客户端编程的更多相关文章

  1. android 之TCP客户端编程

    补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务 中进行,如有问题请百度 thread 或者看下面链接的文章 https://www.cnblogs.com/y ...

  2. Android之TCP服务器编程

    推荐一个学java或C++的网站http://www.weixueyuan.net/,本来想自己学了总结出来再写博客,现在没时间,打字太慢!!!!,又想让这好东西让许多人知道. 关于网络通信:每一台电 ...

  3. python网络编程socketserver模块(实现TCP客户端/服务器)

    摘录python核心编程 socketserver(python3.x版本重新命名)是标准库中的网络编程的高级模块.通过将创建网络客户端和服务器所必须的代码封装起来,简化了模板,为你提供了各种各样的类 ...

  4. 系统编程-网络-tcp客户端服务器编程模型(续)、连接断开、获取连接状态场景

    相关博文: 系统编程-网络-tcp客户端服务器编程模型.socket.htons.inet_ntop等各API详解.使用telnet测试基本服务器功能 接着该上篇博文,咱们继续,首先,为了内容的完整性 ...

  5. --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能

    PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...

  6. Python--网络编程学习笔记系列02 附:tcp服务端,tcp客户端

    Python--网络编程学习笔记系列02 TCP和UDP的概述: udp通信模型类似于写信,不需要建立相关链接,只需要发送数据即可(现在几乎不用:不稳定,不安全) tcp通信模型类似于打电话,一定要建 ...

  7. Java网络编程(TCP客户端)

    TCP传输:两个端点建立连接后会有一个传输数据的通道,这个通道就称为流,而且是建立在网络基础上的流,之为socket流,该流中既可以读取也可以写入. TCP的两个端点:一个客户端:ServerSock ...

  8. python编程系列---tcp客户端的简单实现

    实现流程如下: """ TCP客户端实现流程1. 创建一个tcp 客户端对象2. 与服务端建立连接3. 通过tcp socket 收发数据4. 关闭连接 关闭tcp &q ...

  9. TCP客户端服务器编程模型

    1.客户端调用序列 客户端编程序列如下: 调用socket函数创建套接字 调用connect连接服务器端 调用I/O函数(read/write)与服务器端通讯 调用close关闭套接字 2.服务器端调 ...

随机推荐

  1. dumpe/dumpe2fs/e2fsck

    xt2/3/4文件系统备份工具 导出ext2/ext3/ext4文件系统信息 dumpe2fs e2fsck 强制检查文件系统 检查文件系统

  2. Good Bye 2018题解

    Good Bye 2018题解 题解 CF1091A [New Year and the Christmas Ornament] 打完cf都忘记写题解了qwq 题意就是:给你一些黄,蓝,红的球,满足蓝 ...

  3. NOIP刷题

    搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...

  4. cas系列-cas登出(四)

    跟登陆一样,登出操作也很重要.由于是多应用间操作,状态保持也是一个要点,根据登出的影响范围,可以将登出操作分为两类: 单应用登出 单点登出(多应用登出) 顾名思义,单应用登出即登出只影响被操作的应用会 ...

  5. hive --metastore三种模式

    在官网上对于这几种模式的介绍如下: 按Metastore数据库位置分: 1.本地/嵌入式Metastore数据库(Derby) 2.远程Metastore数据库(其他的关系型数据库,像mysql.or ...

  6. Linux 安装软件报错 Sub-process /usr/bin/dpkg returned an error code (1)

    Linux 通过 apt-get 安装软件时报错,换一个软件安装也一样. Errors were encountered while processing: blueman E: Sub-proces ...

  7. 解读typescript中 super关键字的用法

    解读typescript中 super关键字的用法 传统的js,使用prototype实现父.子类继承.如果父.子类有同名的方法,子类去调用父类的同名方法需要用 “父类.prototype.metho ...

  8. API的查看

    步骤: 1. 双击打开API 2. 点击显示, 找到索引 3. 输入要查找的类名 , 敲击Enter两次 4. 看该类所属的包, java.lang包下的类,在使用的时候不需要导包 ,其他的都需要导包 ...

  9. Tomcat监听shutdown释放数据库连接池

    开发时因为更新代码,频繁重启Tomcat,遇到一个问题:在执行shutdown脚本后,Tomcat进程没有关闭依然存在(但是HTTP服务已经停止),需要手动执行kill命令才行.查了一些资料结合经验, ...

  10. 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器

    加群452892873 下载对应39课文件,运行方法,建好项目,直接替换lib目录 pubspec.yaml city_pickers: ^ AddressAdd.dart import 'packa ...