Qt 学习笔记全系列传送门:

1、TCP 通信

1.1 TCP 编程的特点

  • 包含服务器和客户端
  • 使用时需要在工程文件中引入 QT += network并在使用时导入包
  • 需要使用到的类有
    • QTcpServer
    • QTcpSocket

1.2 TCP 服务器案例

需要先定义并在构造中初始化QTcpServer *tcpServerQTcpSocket *tcpSocket

// 这里传入 this 时,父对象被删除时子对象也会被删除,省去了delete的麻烦
tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);
  • 工程文件

    QT       += core gui network
  • UI

    1. 接收框,只读

    2. 端口号输入框和提示文字

    3. 发送窗口

    4. 按钮,打开服务器、关闭服务器、发送

    5. 控件改名

  • 逻辑功能

    1. 监听:槽函数,点击打开服务器时,需要监听对应端口是否被访问

      Widget::Widget(QWidget *parent) :
      QWidget(parent),
      ui(new Ui::Widget)
      {
      ui->setupUi(this); // 新建tcpServer和tcpSocket的对象,成员属性在头文件中已定义,细节不表
      tcpServer = new QTcpServer(this);
      tcpSocket = new QTcpSocket(this);
      } void Widget::on_openBt_clicked()
      {
      // 开启监听,监听所有人的连接,参数指定所有人和一个无符号整型端口
      tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt());
      }
    2. 接收:包含获取和展示两个部分

      • 获取

        Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
        {
        ui->setupUi(this); tcpServer = new QTcpServer(this);
        tcpSocket = new QTcpSocket(this); // 当监测到新的连接产生的信号时,调用槽函数newConnection_Slot()
        connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection_Slot())); } void Widget::newConnection_Slot()
        {
        // 获取到已经连接的客户端的Socket
        tcpSocket = tcpServer->nextPendingConnection(); // 当存在可读数据时,调用槽函数readyRead_Slot(),用于展示到接收框中
        connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot())); }
      • 展示到接收框

        void Widget::readyRead_Slot()
        {
        // 读取tcpSocket中的内容,使用字符串接收
        QString buf = tcpSocket->readAll(); // 将读取到的信息展示到接收框中
        ui->recvEdit->appendPlainText(buf); }
    3. 发送

      void Widget::on_sendBt_clicked()
      {
      // 需要转成 char*
      tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
      }
    4. 关闭

      void Widget::on_closeBt_clicked()
      {
      tcpServer->close();
      tcpSocket->close();
      }

1.3 TCP 客户端案例

  • 工程文件

    QT       += core gui network
  • UI

    1. 接收框,只读

    2. 端口号输入框和提示文字、IP地址输入框和提示文字

    3. 发送窗口

    4. 按钮,打开服务器、关闭服务器、发送

    5. 控件改名

  • 逻辑功能

    需要先定义并在构造中初始化QTcpSocket *tcpSocket

    tcpSocket = new QTcpSocket(this);

    1. 连接

      void Widget::on_openBt_clicked()
      {
      // 点击打开客户端时,应连接服务器,取界面上的ip和端口,端口要转Uint
      tcpSocket->connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUInt()); // 当监听到连接成功的信号connected()时,调用槽函数connected_Slot()
      connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected_Slot()));
      }
    2. 接收

      void Widget::connected_Slot()
      {
      // 当监听到有东西可读的信号readyRead()时,调用槽函数
      connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot()));
      } void Widget::readyRead_Slot()
      {
      // 读取tcpSocket中的信息,展示到页面上
      ui->recvEdit->appendPlainText(tcpSocket->readAll());
      }
    3. 发送

      void Widget::on_sendBt_clicked()
      {
      // 发送时将发送框中的内容转为 char* 写入tcpSocket
      tcpSocket->write(ui->sendEdit->text().toLocal8Bit());
      }
    4. 关闭

      void Widget::on_closeBt_clicked()
      {
      tcpSocket->close();
      }

2、UDP 通信

1.1 UDP 编程的特点

  • 不分客户端和服务器

  • 使用时需要在工程文件中引入 QT += network并在使用时导入包

  • 需要使用 QUdpSocket 类

1.2 UDP 客户端

需要先定义并在构造中初始化QUdpSocket *udpSocket

udpSocket = new QUdpSocket(this);

  • 工程文件

    QT       += core gui network
  • UI

    1. 接收框,只读
    2. 端口号输入框和提示文字、目标端口号输入框和提示文字、IP地址输入框和提示文字
    3. 发送窗口
    4. 按钮,打开服务器、关闭服务器、发送
    5. 控件改名
  • 逻辑功能

    1. 启动

      void Widget::on_openBt_clicked()
      {
      // 将端口号绑定到Socket
      if (udpSocket->bind(ui->localPortEdit->text().toUInt())) {
      QMessageBox::information(this, "提示", "成功");
      } else {
      QMessageBox::information(this, "提示", "失败");
      }
      // 关联readyRead信号,有可读信号调用槽函数
      connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_slot()));
      }
    2. 接收

      void Widget::readyRead_slot()
      {
      // hasPendingDatagrams()用于判断是否读取完,若没有读完则返回true
      while (udpSocket->hasPendingDatagrams()) {
      QByteArray arr;
      // 将数组调整为和 udpSocket 中剩下的数据大小一样
      arr.resize(udpSocket->pendingDatagramSize());
      // 将udpSocket中的信息读取到arr中,参数为接收数组和接收的数据长度
      udpSocket->readDatagram(arr.data(), arr.size());
      // 将信息写到页面上
      QString buffer = arr.data();
      ui->recvEdit->appendPlainText(buffer);
      }
      }
    3. 发送

      void Widget::on_sendBt_clicked()
      {
      qunit16 port = ui->aimPortEdit->text().toUInt();
      QString sendbuffer = ui->sendEdit->text();
      QHostAddress addr;
      addr.setAddress(ui->aimIpEdit->text()); // 发送的内容需要转成 char*
      udpSocket->writeDatagram(sendbuffer.toLocal8Bit().data(), sendbuffer.length(), addr, port);
      }
    4. 关闭

      void Widget::on_closeBt_clicked()
      {
      udpSocket->close();
      }

Qt 学习笔记 - 第四章 - Qt的三驾马车之 - 网络编程的更多相关文章

  1. Qt 学习笔记 - 第五章 - Qt 时间编程 - Qt 时钟

    原文地址:Qt 学习笔记 - 第五章 - Qt 时间编程 - Qt 时钟 Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布 ...

  2. Qt 学习笔记 - 第三章 - Qt的三驾马车之一 - 串口编程 + 程序打包成Windows软件

    Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布局.界面切换 [本章]Qt 学习笔记 - 第三章 - Qt的三驾马车之一 ...

  3. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  4. o'Reill的SVG精髓(第二版)学习笔记——第四章

    第四章:基本形状 4.1线段 SVG可以使用<line>元素画出一条直线段.使用时只需要指定线段起止点的x和y坐标即可.指定坐标时可以不带单位,此时会使用用户坐标,也可以带上单位,如em. ...

  5. MFC/QT 学习笔记(四)——MFC基于对话框学习控件(上)

    新建项目->MFC模板->MFC应用程序->应用程序类型:基于对话框->...OK 解决方案资源管理器->资源文件->xxx.rc->进入:资源视图-> ...

  6. MFC/QT 学习笔记(四)——MFC基于对话框学习控件(下)

    //5.列表控件 ListControl 属性 报表模式 view:Report:添加变量 //Cdemo5Dlg.cpp ps:资源视图 右键 类向导 成员变量 查看对象所属类 // TODO: 在 ...

  7. Java 学习笔记 ------第四章 认识对象

    本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...

  8. 《metasploit渗透测试魔鬼训练营》学习笔记第四章—web应用渗透

    继续来学习metasploit...记好笔记是很重要的,下面开始正文: 二.WEB应用渗透技术     1.WEB应用渗透基础知识        先介绍WEB应用攻击的主要类型(大致介绍,具体请自行查 ...

  9. c语言学习笔记第四章——字符串和格式化输入、输出

    B站有视频演示 本章学习printf函数的输入输出,字符串的定义与实用. 字符串 字符串(character string)是一个或多个字符的序列,如下所示: "Zing went the ...

  10. [core java学习笔记][第四章对象与类]

    4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...

随机推荐

  1. 解决HtmlUnit执行JS报错提示ScriptException

    问题描述 HtmlUnit作为一款比Selenium更轻量的HeadLess的Java版本浏览器模拟器,不需要在服务器上安装部署浏览器及其Driver程序. 但是,众所周知,HtmlUnit对JS脚本 ...

  2. iframe 高度设置为0时还有占位_iframe占位

    iframe是一个内联元素,默认是跟baseline对齐的,iframe后边有个看不见.摸不着的行内空白节点,空白节点占据着高度,iframe与空白节点的基线对齐,导致了div被撑开,从而出现滚动条, ...

  3. 一文了解npm install -g和npm install --save-dev的关系

    本文分享自华为云社区<npm install -g 和 npm install --save-dev 的关系>,作者: SHQ5785. 一.npm install 本地安装 将安装包放在 ...

  4. .NET 9 预览版:打造云原生及人工智能 AI 平台

    前言 微软发布了 .NET 9 首个预览版,分享.NET团队对 .NET 9 的初步愿景,该愿景将于今年年底在 .NET Conf 2024 上发布. 重点关注针对云原生和人工智能领域的应用程序开发以 ...

  5. 胃食管反流之 SAP分析( in the Ohmega software)

    原文:https://note.youdao.com/s/GED6wise SAP analysis in the Ohmega software ohmega software 关于胃食管反流疾病 ...

  6. wxPython==4.2.1 aui.AuiToolBar 如何去掉烦人的抓手?

    aui.AuiToolBar 如何去掉烦人的抓手? 最近在用wxPython做一些GUI小应用,发现工具栏总有几个点(抓手),很影响美观,如下: 目前官方没有提供隐藏抓手的功能,需要更改源码的auib ...

  7. 透过 Go 语言探索 Linux 网络通信的本质

    前言 各种编程语言百花齐放.百家争鸣,但是 "万变不离其中".对于网络通信而言,每一种编程语言的实现方式都不一样:但其实,调用的底层逻辑都是一样的.linux 系统底层向上提供了统 ...

  8. .net Core中实现SHA加密

    #region 用SHA1加密字符串 /// <summary> /// 用SHA1加密字符串 /// </summary> /// <param name=" ...

  9. weak引用表原理探究

    一.weak引用实现原理探究 首先对<Xcode 10 下如何调试objc4-723>建立的objc源码调试工程表示感谢! 地址:https://www.jianshu.com/p/9e0 ...

  10. 【Java编程教程】详解Java 中的对象和类

    在本页中,我们将了解 Java 对象和类.在面向对象的编程技术中,我们使用对象和类来设计程序. Java中的对象既是物理实体又是逻辑实体,而Java中的类只是逻辑实体. 什么是Java中的对象 具有状 ...