Qt网络编程实现TCP通信

 更新时间:2022年08月18日 15:19:51   作者:喝水怪~  
这篇文章主要为大家详细介绍了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达到目的!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++ Qt开发之LineEdit单行输入组件的用法详解

    C++ Qt开发之LineEdit单行输入组件的用法详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍LineEdit单行输入框组件的常用方法及灵活运用
    2023-12-12
  • C语言数组入门之数组的声明与二维数组的模拟

    C语言数组入门之数组的声明与二维数组的模拟

    这篇文章主要介绍了C语言数组入门之数组的声明与二维数组的模拟,数组学习的同时也要相应理解C语言指针的作用,需要的朋友可以参考下
    2015-12-12
  • C语言数据结构哈希表详解

    C语言数据结构哈希表详解

    哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方,说起来可能感觉有点复杂,我想我举个例子你就会明白了,最典型的的例子就是字典
    2022-02-02
  • C++基于栈实现铁轨问题

    C++基于栈实现铁轨问题

    这篇文章主要介绍了C++基于栈实现铁轨问题,实例分析了C++使用栈实现铁轨问题的思路与解决方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • OnSize、OnSizing和OnGetMinMaxInfo区别分析

    OnSize、OnSizing和OnGetMinMaxInfo区别分析

    这篇文章主要介绍了OnSize、OnSizing和OnGetMinMaxInfo区别分析,需要的朋友可以参考下
    2015-01-01
  • 详解C语言数组中是以列优先吗

    详解C语言数组中是以列优先吗

    这篇文章主要给大家介绍了关于C语言指针名称及所指变量的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • C语言扫雷游戏的实现

    C语言扫雷游戏的实现

    这篇文章主要为大家详细介绍了C语言扫雷游戏的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C++实现银行排队系统

    C++实现银行排队系统

    这篇文章主要为大家详细介绍了C++实现银行排队系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C/C++中字符串流详解及其作用介绍

    C/C++中字符串流详解及其作用介绍

    这篇文章主要介绍了C/C++中字符串流详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论