千家信息网

Qt中网络编程怎么实现

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"Qt中网络编程怎么实现",在日常操作中,相信很多人在Qt中网络编程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Qt中网络编程怎么实现"的疑惑
千家信息网最后更新 2026年11月03日Qt中网络编程怎么实现

这篇文章主要介绍"Qt中网络编程怎么实现",在日常操作中,相信很多人在Qt中网络编程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Qt中网络编程怎么实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、tcp/IP协议簇与udp

1、TCP/IP协议族

TCP/IP实际上是一个协同工作的通信家族,为网络通信提供通路。为方便讨论TCP/IP协议族,大体上分为三部分:

①、Internet协议(IP)。

②、传输控制协议(TCP)和用户数据报协议(UDP)。

③、处于TCP和UDP之上的一组应用协议。它们包括:Telnet,文件传送协议(FTP),域名服务协议(DNS)和简单的邮件传送程序(SMTP)等。

2、udp

udp协议(用户数据报协议),它与TCP协议完全相反。提供不可靠、无连接和基于数据报的服务。不可靠意味着UDP协议无法保证数据从发送端正确的发送到接收端。如果数据在中途丢失,或者目的端通过数据校验发现数据错误而将其丢弃,则UDP协议的应用程序通常要自己处理数据确认、超时重传等逻辑性。

3、常用的通讯协议小结

1.3.1、tcp/ip

tcp只需要知道它是一种通讯方式就可以了,还有一个udp,那这两者之间的关系是什么。TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了,tcp是打电话,udp是发短信。

Ip(网络之间互连的协议,外文是Internet Protocol的外语缩写,中文缩写为"网协"。缩写为IP),通过设置ip地址就可以去访问网络,用的最多的ip协议是ipv4(ip协议v版本4),还有一个版本为ipv6,ipv4不够用了,Ipv4版本是32位的,一般分成4段,内存中就是一个无符号32位的整数,ipv6的话就是一个64位的整数,通过位数就知道ipv4和ipv6的区别,能保存多少个的地址。只不过用户并不需要去搞清楚。

现在常用的ip是127.0.0.1这个样子,点分格式(一个字符串)。点所隔开的区间就是一个字符。Ip地址有ABC三类地址。前三段是用来确定路由器,确定主机连上外围网上的哪一个路由,最后一段用来确定主机,确定主机是这个路由器上的第多少台,最多255台,0一般是用来做网关的。

ip对应的还有一个子网掩码

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。子网掩码--屏蔽一个IP地址的网络部分的"全1"比特模式。

对于A类地址来说,默认的子网掩码是255.0.0.0;

对于B类地址来说默认的子网掩码是255.255.0.0;

对于C类地址来说默认的子网掩码是255.255.255.0。

子网掩码,一般是255.255.255.0。

ip地址的前三段来确定路由器,最后一段是主机位置。所以子网掩码理解为子网遮罩编码。

1.3.2、Socket

pc机对应在网络上就是一台主机,在这台Pc机上面会有多个进程需要访问网络,所以需要在Pc机的操作系统上面去有处理网络的东西,前人就定了一个"套接字"来专门处理网络(源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字)。把一个主机拆分为N个网络端口(Port)一共会有65536个,short的最大范围,在这些端口当中,要注意0-5000的端口一般不用,用来给操作系统的进程来使用的。一般会用靠后一点的端口,这样比较安全,当然还有一些端口,比如8080端口也会用的比较多,一个进程只能占用一个端口,不能多进程占用同一个端口的情况,一个进程可以占用多个端口的,或者严谨一点,同一时刻一个端口只能由一个进程使用。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

1.3.3、tcp通信模型

c/s模型,客户端(c)/服务器(s)模型,一个服务器来对应多个客户端的处理,一对多的关系。以下步骤没有特殊指明,服务器和客户端是都需要有的步骤:

1.准备工作,根据自己使用语言所有库函数导入;

2. 确定版本信息,要确定socket版本,ip是有v4和v6两个版本的;

3. 创建socket,使用socket函数

4. 初始化协议地址簇 ;

5. 绑定,使用bind函数,把协议地址簇和socket绑定在一起,客户端不要绑定;

6. 服务器端有,需要监听 listen函数,客户端不需要这一步;

7. 服务器端需要接受连接,客户端需要连接服务器;

8. 连接完成之后,开始通讯,收发数据;

9. 通讯完成后关闭socket;

二、Qt中的tcp(这里只展示代码)

开始前在项目的.pro文件中加入这个network

1、tcpsever

tcpsever.h

#ifndef WIDGET_H#define WIDGET_H #include #include //网络信息#include //id地址#include  //tcp协议#include  //socket套接字#include #include namespace Ui {class Widget;} class Widget : public QWidget{    Q_OBJECT public:    explicit Widget(QWidget *parent = 0);    ~Widget(); private slots:    void on_pushButton_listen_clicked();     void on_pushButton_send_clicked();    void newconnectslot();//连接    void readyRead_Slot();//读取信息    void disconnected_Slot();//断开private slots:    QString list_all_IPV4(); private:    Ui::Widget *ui;    //2、设置服务端和接收客户端的对象    QTcpServer *tcpServer;    QTcpSocket *tcpSocket;}; #endif // WIDGET_H

tcpsever.cpp

#include "widget.h"#include "ui_widget.h" Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    //3、创建服务器对象    tcpSocket=NULL;    tcpServer=new QTcpServer(this);    //5、有客户端连接服务器发送信号    connect(tcpServer,            SIGNAL(newConnection()),            this,            SLOT(newconnectslot()));    QMessageBox::information(this,"本机联网端口显示",this->list_all_IPV4());} Widget::~Widget(){    delete ui;} void Widget::on_pushButton_listen_clicked(){    //4、开始监听    QString sever_Address = ui->lineEdit_address->text();    quint16 port          = ui->lineEdit_port->text().toInt();    QHostAddress host     = QHostAddress(sever_Address);    if(!tcpServer->isListening()){        //监听绑定的ip地址        if(!tcpServer->listen(host,port))        {            qDebug()<errorString();            return;        }else{            qDebug()<<"监听成功";            ui->pushButton_listen->setText("停止监听");        }    }else{        tcpServer->close();        ui->pushButton_listen->setText("开始监听");    }} QString Widget::list_all_IPV4(){            QString str;            QList list=QNetworkInterface::allAddresses();     //获取本机的所有网卡的ip地址            foreach (QHostAddress address, list)            {                if(address.isNull())                    continue;                QAbstractSocket::NetworkLayerProtocol portocol=address.protocol();                //只提取IPv4地址                if(portocol!=QAbstractSocket::IPv4Protocol)                    continue;                 str = str +'\n\t'+address.toString() + '\n\t\t';            }            return str;}; void Widget::newconnectslot(){    //6、接受客户端    tcpSocket = tcpServer->nextPendingConnection();    QString client_Info = "客户端:" + tcpSocket->peerAddress().toString()                          +" "+                          "端口号:"    + QString::number(tcpSocket->peerPort());    ui->textBrowser_clientInfo->setText(client_Info);    //发送信号和读取关联    connect(tcpSocket,            SIGNAL(readyRead()),            this,            SLOT(readyRead_Slot()));    //断开信号关联客户端    connect(tcpSocket,            SIGNAL(disconnected()),            this,            SLOT(disconnected_Slot()));}; void Widget::on_pushButton_send_clicked(){    if(tcpSocket != nullptr)    {        if(tcpSocket->isWritable())        {            QString send = ui->plainTextEdit_sendInfo->toPlainText();             QByteArray sendarr = send.toLocal8Bit();//本地字符集与Unicode的转换             tcpSocket->write(sendarr);        }    }} void Widget::readyRead_Slot(){    if(tcpSocket != nullptr)    {        if(tcpSocket->isReadable())        {           QByteArray recvAll = tcpSocket->readAll();//将数据全部读取            QString str = str.fromLocal8Bit(recvAll.data());            ui->textBrowser_recv->append(str);        }    } }; void Widget::disconnected_Slot(){    QMessageBox::information(this,"Client Close Signal","有客户离开");};

2、tcpclient

tcpclient,h

#ifndef WIDGET_H#define WIDGET_H #include #include //网络信息#include //id地址#include  //tcp协议#include  //socket套接字#include #include namespace Ui {class Widget;} class Widget : public QWidget{    Q_OBJECT public:    explicit Widget(QWidget *parent = 0);    ~Widget(); private slots:    void on_pushButton_listen_clicked();    void on_pushButton_send_clicked();     void readyRead_Slot();//读取信息    void disconnected_Slot();//断开 private:    Ui::Widget *ui;    QTcpSocket *client;    bool socket_state;}; #endif // WIDGET_H

tcpclient.cpp

#include "widget.h"#include "ui_widget.h" Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    client = new QTcpSocket(this);    socket_state = false;     connect(client,            SIGNAL(disconnected()),            this,            SLOT(disconnected_Slot()));     connect(client,            SIGNAL(readyRead()),            this,            SLOT(readyRead_Slot()));} Widget::~Widget(){    delete ui;}  void Widget::on_pushButton_listen_clicked(){    QString ipAddress = ui->lineEdit_address->text();    qint16 port = ui->lineEdit_port->text().toInt();     if(!socket_state)    {        client->connectToHost(ipAddress,port);        if(client->waitForConnected(3000)){//等待3s,连不上会返回假            ui->pushButton_listen->setText("断开连接");            socket_state = true;        }else{            qDebug()<errorString();            return;        }    }else{        client->close();        QMessageBox::information(this,"消息提示","已经离开!",QMessageBox::Yes);        ui->pushButton_listen->setText("连接");        socket_state = false;    }} void Widget::readyRead_Slot(){    QByteArray data=client->readAll();    QString str=str.fromLocal8Bit(data.data());    ui->textBrowser_recv->append(str); }; void Widget::disconnected_Slot(){     qDebug()<<"离开";} void Widget::on_pushButton_send_clicked(){    QString datastr = ui->plainTextEdit_sendInfo->toPlainText();    QByteArray da = datastr.toLocal8Bit();     if(client->isOpen() && client->isValid()){        client->write(da);    }}

三、QT中的Udp

初始操作同TCP操作

udp_test.h

#ifndef WIDGET_H#define WIDGET_H #include  //1、包含相关的头文件#include #include #include  namespace Ui {class Widget;} class Widget : public QWidget{    Q_OBJECT public:    explicit Widget(QWidget *parent = 0);    ~Widget(); private slots:    void on_pushButtonSend_clicked();    void readyReadSlot();    void on_pushButtonCLose_clicked(); private:    Ui::Widget *ui;    //2、定义udp对象    QUdpSocket *udpSocket;}; #endif // WIDGET_H

udp_test.cpp

#include "widget.h"#include "ui_widget.h" Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    //3、创建对象    udpSocket=new QUdpSocket(this);     //4、关联读取的信号与槽    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyReadSlot())); } Widget::~Widget(){    delete ui;} void Widget::on_pushButtonSend_clicked(){    udpSocket->writeDatagram(ui->plainTextEdit_sendInfo->toPlainText().toLocal8Bit(),//内容                             QHostAddress(ui->lineEditIp->text()),//发送ip                             ui->lineEditPort->text().toInt());//发送的地址} void Widget::on_pushButtonCLose_clicked(){    udpSocket->bind(ui->lineEditPort_2->text().toInt());} void Widget::readyReadSlot(){  quint64 size = udpSocket->bytesAvailable();//读取发过来的消息大小  QByteArray ba;  ba.resize(size);  QHostAddress address;  quint16 port;   udpSocket->readDatagram(ba.data(),size,&address,&port);  QString str = QString::fromLocal8Bit(ba.data());   ui->textEdit_recvInfo->append(str);}

到此,关于"Qt中网络编程怎么实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

地址 网络 子网 客户 端口 数据 服务 主机 客户端 服务器 通信 编程 就是 版本 进程 信息 套接字 监听 网络编程 信号 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技企业 保险科技 互联网保险 亿人帮互联网科技有限公司 互联网属科技 互联网科技战争 互联网金融 科技金融 奇酷互联网络科技公司 齐家互联网科技有限公司 多迪互联网科技有限公司 重庆科技学院互联网 科技与互联网哪个更好 深圳育鹏互联网科技有限公司招聘 朱啸虎曾投资哪些互联网科技企业 卓翼科技产业互联网合作 合肥互联网科技公司公章图片 伍佰万互联网科技怎么赚钱 互联网企业科技类企业如何做账 电子商务与互联网科技的关系 中天科技中国工业互联网 易租星互联网科技有限公司 蓝思科技飞鸽互联网 长亮科技 互联网金融 阿里巴巴算科技企业还是互联网 岳阳华臻互联网科技有限公司 语蝶互联网科技有限公司 苏州铭阳互联网科技有限公司 卓翼科技产业互联网合作 互联网金融科技元年 智帮互联网科技公司最近动向 科技信息时代互联网发展
0