Qt网络编程实现TCP通信

Qt网络编程实现TCP通信,供大家参考,具体内容如下

标签(空格分隔): Tcp通信

一、Tcp简介

(1)TCP(Transmission Control Protocol,传输控制协议)TCP是一个用于数据传输的传输层网络协议,多个网络协议包括(HTTP和FTP都是基于TCP协议),TCP是面向数据流和连接的可靠的传输协议,它区别于传输层的另外一个协议UDP(具体可看—Qt简单实现UDP通信) 。

(2)QTcpSocket继承自QAbstractSocket,与QUdpSocket传输的数据报不同的是,QTcpSocket传输的是连续的数据流,尤其适合连续的数据传输,TCP一般分为客户端和服务端,即C/S (Client/Server模型)。

(3)QTcpSocket代表了两个独立的数据流,一个用来读取数据,一个用来写入数据,分别采用QTcpSocket::read()及QTcpSocket::write()操作,读取数据前先调用QTcpSocket::bytesAvailable来确定已有足够的数据可用。QTcpServer处理客户端的连接,可通过QTcpServer::listen()监听客户端发来的连接请求,每当有客户端连接时会发射newConnection()信号,QTcpSocket可用于读取客户端发来的数据报,亦可发送数据报。

二、传输层两大协议Tcp\Udp的异同

三、小demo实现Tcp客户端服务端通信

1、服务端:

新建Qt Widgets Application,用作tcp服务端,服务端任何时候只能被动等待连接,继承自Qwidget类即可,设计ui界面,界面如下:

打开pro文件,添加支持网络编程模块,客户端也需做如下修改:

添加tcp服务端m_tcpServer、tcp服务端套接字m_tcpSocket,在构造函数中监听客户端的连接,样例中服务端主要监听任何任何ip地址上的6666端口,并为客户端连接时的newConnection信号添加相应的槽函数。

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpServer> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget {     Q_OBJECT public:     Widget(QWidget *parent = nullptr);     ~Widget(); private slots:     void onNewConnect();    //客户端新的连接请求处理     void onSendBackMsg();   //反馈信息给客户端新的连接     void onReadMsg();       //服务端读取客户端发来的数据 private:     Ui::Widget *ui;     QTcpServer* m_tcpServer;    //tcp服务端     QTcpSocket* m_tcpSocket;    //tcp套接字 }; #endif // WIDGET_H

当服务端收到客户端的连接时,服务端tcp反馈信息给客户端,同时客户端显示的数据显示到标签上:

#include "widget.h" #include "ui_widget.h" #include <QTcpSocket> Widget::Widget(QWidget *parent)     : QWidget(parent)     , ui(new Ui::Widget) {     ui->setupUi(this);     m_tcpServer=new QTcpServer(this);     //服务端监听客户端发来的请求     if(!m_tcpServer->listen(QHostAddress::AnyIPv4,6666)){         qDebug()<<m_tcpServer->errorString();         close();     }     connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::onNewConnect);     connect(m_tcpServer,&QTcpServer::newConnection,this,&Widget::onSendBackMsg); } Widget::~Widget() {     delete ui; } void Widget::onNewConnect() {     //当前连接的客户端     m_tcpSocket=m_tcpServer->nextPendingConnection();     //断开连接     connect(m_tcpSocket,&QTcpSocket::disconnected,             m_tcpSocket,&QTcpSocket::deleteLater);     //socket有数据时会发送readyRead信号     connect(m_tcpSocket,&QTcpSocket::readyRead,             this,&Widget::onReadMsg); } void Widget::onSendBackMsg() {     QString str="你好,客户端!";     m_tcpSocket->write(str.toUtf8());     ui->label->setText("反馈数据成功!"); } void Widget::onReadMsg() {     //服务端将客户端发来的数据显示到标签上     QByteArray bt=m_tcpSocket->readAll();     ui->readLabel->setText(bt); }

2、客户端

与服务端一样,再新建Qt Widgets Application项目,用作tcp客户端,继承自Qwidget类即可,设计ui界面,界面如下:

添加客户端tcp,在pro文件中添加网络编程模块network,给连接、发送按钮添加点击信号。

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpSocket> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget {     Q_OBJECT public:     Widget(QWidget *parent = nullptr);     ~Widget(); private slots:     void onReadMessage();   //处理服务端反馈的数据     void onDisplayError(QAbstractSocket::SocketError e);    //打印错误信息     void on_connectBtn_clicked();   //点击连接按钮响应信号的槽函数     void on_sendBtn_clicked();  //点击发送按钮响应的槽函数 private:     Ui::Widget *ui;     QTcpSocket* m_tcpSocket;    //tcp客户端 }; #endif // WIDGET_H

构造函数中为服务端发来数据时触发的readyRead信号添加了响应的槽函数onReadMessage,同时设置了客户端连接时的默认ip地址和端口,onReadMessage槽函数将服务端反馈的数据显示到标签上,on_sendBtn_clicked槽函数中将行编辑框中的内容发送给tcp服务端。

#include "widget.h" #include "ui_widget.h" #include <QAbstractSocket> const int gTcpPort=6666; Widget::Widget(QWidget *parent)     : QWidget(parent)     , ui(new Ui::Widget) {     ui->setupUi(this);     m_tcpSocket=new QTcpSocket(this);     //socket有数据来了,做处理     connect(m_tcpSocket,&QTcpSocket::readyRead,             this,&Widget::onReadMessage);     connect(m_tcpSocket,SIGNAL(QAbstractSocket::SocketError),             this,SLOT(onDisplayError(QAbstractSocket::SocketError)));     //设置客户端连接默认的主机地址及端口号     ui->hostLineEdit->setText("127.0.0.1");     ui->portLineEdit->setText(QString::number(gTcpPort)); } Widget::~Widget() {     delete ui; } void Widget::onReadMessage() {     QByteArray bt;     bt.resize(m_tcpSocket->bytesAvailable());     m_tcpSocket->read(bt.data(),bt.size());     //将客户端反馈的数据显示到标签上     ui->recvLabel->setText(bt); } void Widget::onDisplayError(QAbstractSocket::SocketError e) {     qDebug()<<"SocketError:"<<e<<endl            <<m_tcpSocket->errorString(); } void Widget::on_connectBtn_clicked() {     m_tcpSocket->abort();     //连接服务端     m_tcpSocket->connectToHost(ui->hostLineEdit->text(),                                ui->portLineEdit->text().toInt()); } void Widget::on_sendBtn_clicked() {     m_tcpSocket->write(ui->sendEdit->text().toUtf8());     m_tcpSocket->flush();//清空缓冲区 } 四、运行结果

先打开服务端,再运行客户端

客户端采用默认ip和端口,这里的ip地址也可修改为其他,端口必须与服务端监听端口一致,点击连接:

在行编辑框中随便输入内容,点击发送:

ok达到目的!

推荐阅读

    电脑tcpip协议|计算机tcpip协议

    电脑tcpip协议|计算机tcpip协议,,计算机tcpip协议在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。现在人们经常提到的 T

    TCP和UDP的主要区别是什么

    TCP和UDP的主要区别是什么,数据,协议,TCP和UDP的主要区别是什么1、在连接上,TCP是基于连接的,是面向连接的运输层协议,如打电话之前要拨号建

    IP头、TCP头、UDP头详解以及定义

    IP头、TCP头、UDP头详解以及定义,报文,字节,IP数据包也叫IP报文分组,传输在ISO网络7层结构中的网络层,它由IP报文头和IP报文用户数据组成,IP

    TCP是什么意思

    TCP是什么意思,协议,数据包,数据,传输,节点,确保,TCP,即传输控制协议(Transmission Control Protocol),是一种网络通信协议,旨在通过Internet发送数

    tcp和udp有什么区别

    tcp和udp有什么区别,数据,连接,报文,传输,状态,协议,tcp和udp的区别有:1、udp是无连接的,tcp是面向连接的;2、udp是不可靠传输,tcp是可靠传输;3、udp

    Go语言TCP网络编程|详细

    Go语言TCP网络编程|详细,数据,操作, 一、序言 Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少

    电脑不支持tcpip|电脑不支持win11

    电脑不支持tcpip|电脑不支持win11,,电脑不支持win11由于严格的系统要求,许多计算机将无法升级到Windows 11。微软对此有自己的理由。为了检

    快车的TCP端口/UDP端口是什么

    快车的TCP端口/UDP端口是什么,端口,连接,服务进程,地址,快车,用户程序,  快车的TCP端口/UDP端口说明如下:TCP和UDP服务通常有一个用户/服务器

    tcp协议详解介绍

    tcp协议详解介绍,协议,连接,数据,应用层,实体,确认,  导读:我们在很多地方都会是否同意TCP协议的字样,很多人都不知道TCP协议到底是什么,我们为