目录标题

  • 一、开发基础知识
    • 1、QT的网络编程: TCP和UDP
    • 2、网络编程接口
      • 1. listen
      • 2. connect
  • 二、TCP编程
    • 1、TCP服务端实现流程
    • 2、TCP客户端实现流程
  • 三、UDP编程
  • 四、源码
    • 1. TCP服务端
    • 2. TCP客户端
    • 3. UDP

一、开发基础知识

1、QT的网络编程: TCP和UDP

TCP编程需要用到俩个类: QTcpServer 和 QTcpSocket

QTcpSocket类提供了一个TCP套接字

  1. QTcpSocket是QAbstractSocket的一个子类,它允许您建立TCP连接和传输数据流
    注意:TCP套接字不能在QIODevice::Unbuffered模式下打开。

QTcpServer类提供一个基于tcp的服务器
2. 这个类可以接收传入的TCP连接。您可以指定端口或让QTcpServer自动选择一个端口。你可以监听一个特定的地址或所有机器的地址。
3. 调用listen()让服务器侦听传入的连接。然后,每当客户机连接到服务器时,都会发出newConnection()信号。
4. 调用nextPendingConnection()接受挂起的连接作为已连接的QTcpSocket。该函数返回一个指向QAbstractSocket::ConnectedState中的QTcpSocket的指针,您可以使用该指针

2、网络编程接口

1. listen

功能:设置监听数和分配端口,监听客户端连接

bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

如果address为QHostAddress::Any,服务器将侦听所有网络接口;
为QHostAddress::LocalHost,IPv4本地主机地址,相当于QHostAddress(“127.0.0.1”)
当“port”为“0”时,系统自动分配端口
成功 true;失败 false

2. connect

功能:connect,是QT中的连接函数,将信号发送者sender对象中的信号signal与接受者receiver中的member槽函数联系起来。当指定信号signal时必须使用宏SIGNAL () ,当指定槽函数时必须使用宏SLOT()

connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context,     Func2 slot, Qt::ConnectionType type = Qt::AutoConnection)

二、TCP编程

目标创建一个TCP服务端和一个TCP 客户端简单网络调试助手

1、TCP服务端实现流程

1. 创建项目

创建一个Qt Widgets Application项目 项目名称和位置都不要包含中文 基类选择QWidget

2. UI设计

接收窗口使用 QPlainTextEdit 并修改为只读
发送窗口使用 Line Edit

3. .h文件中包含头文件

#include <QTcpServer>
#include <QTcpSocket>

4. qmake文件中添加network

QT       += core gui network

5. Widget类构造函数中创建QTcpServer和QTcpSocket的对象用作监听套接字

tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);

tcpServer 和 tcpSocket 对象指针需要在Widget类中声明

QTcpServer *tcpServer;
QTcpSocket *tcpSocket;

6. 使用listen()方法监听网卡的ip和端口(打开服务器)
侦听IPv4和IPv6接口,端口为portEdit输入的内容

void Widget::on_openBt_clicked()
{tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt());
}

7. 如果有新的连接过来,并且连接成功,服务器会触发newConnection()信号,通过槽函数取出连接成功的socket

connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection_Slot())); //连接请求到来,触发newConnection信号,并回调槽函数void Widget::newConnection_Slot()
{while (tcpServer->hasPendingConnections()) //有待连接请求{tcpSocket = tcpServer->nextPendingConnection(); //连接并返回套接字connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot())); //套接字有数据到来触发信号readyRead(),回调槽函数}
}

8. 如果有数据成功传送过来,对方的通信套接字QTcpSocket会触发readyRead()信号,在槽函数可以进行读取

void Widget::readyRead_Slot()
{QString buf = tcpSocket->readAll();    //读数据ui->recvEdit->appendPlainText(buf);  //追加显示
}

9. 发送数据

void Widget::on_sendBt_clicked()
{tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}

10. 关闭套接字(关闭服务器)

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

2、TCP客户端实现流程

1. 创建项目
基类选择QWidget
2. UI设计

3. .h文件中包含头文件

#include <QTcpServer>
#include <QTcpSocket>

4. qmake文件中添加network

QT       += core gui network

5. Widget类构造函数中创建QTcpSocket的对象用作监听套接字

tcpSocket = new QTcpSocket(this);

tcpSocket 对象指针需要在Widget类中声明

QTcpSocket *tcpSocket;

6. connectTohost()绑定ip和端口号进行连接,连接成功会触发connected()信号,将该信号与槽函数关联

void Widget::on_openBt_clicked()
{tcpSocket->connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUInt());connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected_Slot()));
}

7. readyRead()信号和槽函数关联

void Widget::connected_Slot()
{connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot()));
}

8. 读数据

void Widget::readyRead_Slot()
{QString buf = tcpSocket->readAll();ui->recvEdit->appendPlainText(buf);
}

9. 发送数据

void Widget::on_sendBt_clicked()
{tcpSocket->write(ui->sendEdit->text().toLocal8Bit());
}

10. 关闭套接字

void Widget::on_sendBt_clicked()
{tcpSocket->write(ui->sendEdit->text().toLocal8Bit());
}

三、UDP编程

udp通信这里不分服务端和客户端

1. 创建项目
基类选择QWidget
2. UI设计

3. .h文件中包含头文件

#include <QUdpSocket>

4. qmake文件中添加network

QT       += core gui network

5. Widget类构造函数中创建QTcpSocket的对象用作监听套接字

udpSocket = new QUdpSocket(this); //获取套接字

udpsocket对象指针需要在Widget类中声明

QUdpSocket *udpSocket;

6. bind()设置本地端口号,准备读信号与槽函数关联(打开udp连接)

void Widget::on_openBt_clicked()
{udpSocket->bind(ui->localPort->text().toUInt());  //绑定本地端口connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_slot()));  //准备读信号与槽函数关联
}

7. 读数据

void Widget::readyRead_slot()
{while(udpSocket->hasPendingDatagrams()) {   //udp与tcp不同,udp需要判断数据是否读完QByteArray array;array.resize(udpSocket->pendingDatagramSize()); //调整array数组大小与数据报大小一致udpSocket->readDatagram(array.data(), array.size()); //读取数据报到array.data中、QString buf = array.data(); //将数据类型转换成string类型ui->recvEdit->appendPlainText(buf); //将数据显示到接收窗口}
}

8. 发送数据

void Widget::on_sendBt_clicked()
{QHostAddress address;address.setAddress(ui->aimIp->text());udpSocket->writeDatagram(ui->sendEdit->text().toLocal8Bit().data(), //发送内容 const char *ui->sendEdit->text().length(), //内容长度 qint64address, //目标IP const QHostAddress &ui->aimPort->text().toUInt()); //目标端口 quint16
}
  1. 关闭套接字
udpSocket->close();

四、源码

1. TCP服务端

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QString>namespace Ui {class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();QTcpServer *tcpServer;  //声明套接字QTcpSocket *tcpSocket;private slots:  //槽函数声明void newConnection_Slot();void readyRead_Slot();void on_openBt_clicked();void on_closeButton_clicked();void on_sendBt_clicked();private:Ui::Widget *ui;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);tcpServer = new QTcpServer(this);   //获取套接字tcpSocket = new QTcpSocket(this);connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection_Slot())); //新连接请求信号与连接槽函数关联
}void Widget::newConnection_Slot()
{while (tcpServer->hasPendingConnections())  //有待连接请求{tcpSocket = tcpServer->nextPendingConnection(); //连接并返回套接字connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot())); //读准备信号与读槽函数关联}
}void Widget::readyRead_Slot()   //读取数据并显示到接收窗口
{QString buf = tcpSocket->readAll();ui->recvEdit->appendPlainText(buf);
}Widget::~Widget()
{delete ui;
}void Widget::on_openBt_clicked()   //打开服务器
{tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt()); //监听接口,设计端口号
}void Widget::on_closeButton_clicked()   //关闭套接字
{tcpSocket->close();
}void Widget::on_sendBt_clicked()   //发送数据
{tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}

2. TCP客户端

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QString>namespace Ui {class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);QTcpSocket *tcpSocket;~Widget();private slots:void connected_Slot();void readyRead_Slot();void on_closeBt_clicked();void on_sendBt_clicked();void on_openBt_clicked();private:Ui::Widget *ui;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);tcpSocket = new QTcpSocket(this);    //获取套接字
}Widget::~Widget()
{delete ui;
}void Widget::connected_Slot()
{connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot())); //读准备信号关联槽函数
}void Widget::readyRead_Slot()  //读数据
{QString buf = tcpSocket->readAll();ui->recvEdit->appendPlainText(buf);
}void Widget::on_sendBt_clicked()   //发送数据
{tcpSocket->write(ui->sendEdit->text().toLocal8Bit());
}void Widget::on_closeBt_clicked()  //关闭套接字
{tcpSocket->close();
}void Widget::on_openBt_clicked()   //连接服务器,连接成功信号和槽函数关联
{tcpSocket->connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUInt());connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected_Slot()));  //可替换如下//connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot()));
}

3. UDP

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QUdpSocket>
#include <QString>namespace Ui {class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();QUdpSocket *udpSocket;private slots:void on_openBt_clicked();void readyRead_slot();void on_sendBt_clicked();void on_closeBt_clicked();private:Ui::Widget *ui;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);udpSocket = new QUdpSocket(this); //获取套接字
}Widget::~Widget()
{delete ui;
}void Widget::on_openBt_clicked()
{udpSocket->bind(ui->localPort->text().toUInt());  //绑定本地端口connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_slot()));  //准备读信号与槽函数关联
}void Widget::readyRead_slot()
{while(udpSocket->hasPendingDatagrams()) {   //udp与tcp不同,udp需要判断数据是否读完QByteArray array;array.resize(udpSocket->pendingDatagramSize()); //调整array数组大小与数据报大小一致udpSocket->readDatagram(array.data(), array.size()); //读取数据报到array.data中、QString buf = array.data(); //将数据类型转换成string类型ui->recvEdit->appendPlainText(buf); //将数据显示到接收窗口}
}void Widget::on_sendBt_clicked()
{QHostAddress address;address.setAddress(ui->aimIp->text());udpSocket->writeDatagram(ui->sendEdit->text().toLocal8Bit().data(), //发送内容 const char *ui->sendEdit->text().length(), //内容长度 qint64address, //目标IP const QHostAddress &ui->aimPort->text().toUInt()); //目标端口 quint16
}void Widget::on_closeBt_clicked()
{udpSocket->close(); //关闭套接字
}

QT网络编程TCP/UDP开发流程 制作网络调试助手相关推荐

  1. 网络编程(Tcp/Udp实现聊天、文件上传)

    网络编程 1.1 概述 计算机网络是指将位置不同的多台[计算机 通过通信线路连接起来,实现资源共享和信息传递的计算机系统 1.2 网络通信的要素 ip和端口 网络通信协议(tcp/udp) 1.3 I ...

  2. [windows网络编程]tcp/udp编程初步详解-转

    #pragma comment (lib,"ws2_32.lib") #include <Winsock2.h> #include <stdio.h> 如你 ...

  3. 网络编程---TCP/UDP套接字编程原理

    本篇介绍的是Linux下的网络编程,故有些接口是不适用于Windows的,但是具体概念和实现方法是大体一致的 本篇重在讲解原理,具体实现请戳这里->UDP套接字编程实现 介绍 网络编程套接字(s ...

  4. 大数据 -- java基础16 网络编程 TCP UDP

    1.网络编程的三要素:(1)IP地址(2)端口号(3)协议 2.IP地址 : 网络中计算机唯一标识. (1)IP地址在计算机中存储的时候是由二进制的形式进行存储的:IP:192.168.7.42 十进 ...

  5. 网络编程-tcp/udp

    Java网络编程 计算机网络就是通过传输介质.通信设施和网络协议,把分散在不同地点的计算设备互连起来,实现资 源共享和数据传输的系统. TCP/IP协议簇 TCP/IP协议栈是一系列网络协议的总和,是 ...

  6. 【Java】网络编程——TCP/UDP网络对讲机

    目录 前言 OSI概述 传输层 端口 Socket InetAddress类 UDP协议间的通信 UDP协议相关类 UDP 发送端 UDP 接收端 + 发送端 UDP 聊天 + 全局广播 UDP发送大 ...

  7. 网络编程 TCP/UDP

    网络编程 打电话–连接–接了–通话->TCP连接 发短信------发送了就完事了---->UDP连接 网络编程的目的: 传播交流信息,数据交换.资源共享.通信 想要打到这个效果需要什么: ...

  8. JDK -- 网络编程(TCP/UDP)

    三要素: IP地址: 设备在网络中的地址,是唯一的标识 端口: 应用程序在设备中唯一的标识 协议 : 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议 InetAddress -- 代表IP ...

  9. 网络编程---tcp/udp协议

    协议使用场景: udp协议(User Datagram Protocol) 即时通讯类的软件 :qq 微信 飞信 歪歪 tcp协议(Transmission Control Protocol) 发邮件 ...

  10. QT入门第七天 网络编程TCP/IP/UDP+Http和JSON解析+qt事件软键盘【CSDN最详细】

    网络编程+Http和JSON解析+qt事件软键盘 第一章 QT中的网络编程 [1]涉及到的类 [2]tcp协议的流程 [2.1]服务器的流程 socket-->bind-->listen- ...

最新文章

  1. vue组件的基本使用,以及组件之间的基本传值方式
  2. CTFshow 爆破 web21
  3. JQuery动态执行javascript代码的方法
  4. 台湾ML笔记--1.2 formalize the learning probelm
  5. nacos 公共_Nacos数据模型
  6. OpenCV threshold 二值化
  7. C 标准库—— string.h
  8. 第二节: 外部中断学习(用CubeMX学习STM32)
  9. kubernetes视频教程笔记 (11)-pod容器生命周期、Init容器
  10. 麻瓜python视频教程_2019年最新麻瓜编程,Python商业爬虫学徒计划全套视频教程下载...
  11. 刘宇凡:苍井空靠粉丝经济卖内衣还能持续多久?
  12. 百度坐标拾取html,使用百度批量拾取坐标点-汇总
  13. 胡侃学习(理论)计算机-From 南大小百合
  14. 苏州优步高级车资费标准和奖励政策
  15. 艾美捷SequENZ测序级改造型胰蛋白酶特异性和应用
  16. 科技发烧友之3d吉米投影
  17. RabbitMQ教程_2 RabbitMQ 安装
  18. 〖Python语法进阶篇⑱〗- 综合实战 - 抽奖系统之admin模块 - 抽奖系统之admin模块 - 实现对奖品的增删改操作
  19. PIE-engine APP教程 ——基于水体指数或监督分类方法的水体频率计算
  20. 数据分析---众包任务

热门文章

  1. Java 代理中转下载 url 文件
  2. 联想微型计算机ai0,联想baby AI
  3. 计算机专业及相关知识测试,计算机知识及测验考试.doc
  4. 网吧如何修改dns服务器地址,网吧更改dns服务器地址
  5. c# chart 点值标注_C# chart控件参数设定总结
  6. 数据库系统概念第六版
  7. 如何获取股票数据接口?
  8. 独家首发强大的个性生成工具箱微信小程序源码,超多功能的合成
  9. VMware及相关产品序列号大全
  10. 16QAM调制解调步骤