Qt中TCP协议通信详解

 更新时间:2022年08月19日 17:04:54   作者:码灵薯  
这篇文章主要为大家详细介绍了Qt中TCP协议通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

TCP协议是经常使用的通信方式。在QT中做了非常友好的封装,使用非常方便。

需要添加的模块:network

Qt中的TCP类:QTcpSocket , QTcpServer

常用函数介绍

连接目标地址和端口

virtual void QTcpSocket ::connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);

  • 发送数据

inline qint64 QTcpSocket ::write(const QByteArray &data)

  • 监听某个地址和端口号

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

  • 有新的连接信号

void QTcpServer::newConnection();

  • 是否有新的连接

virtual bool QTcpServer::hasPendingConnections() const;

  • 获取新的连接,必须处理完才能继续接收到连接

virtual QTcpSocket *QTcpServer::nextPendingConnection();

  • 收到新的数据信号

void QTcpSocket::readyRead();

  • 读取收到的数据,必须读取完才能继续接收

QByteArray readAll();

使用案例(example)

客户端

#include <QTcpSocket>
#include <QWidget>
#include <QLineEdit>
class Client : public QWidget
{
    Q_OBJECT
public:
    Client(QWidget *parent);

public slots:
    void slotSendButtonClick();
private:
    QTcpSocket *_socket;
    QLineEdit *_lineEdit;
    bool _isConnected;
};
#include "client.h"
#include <QPushButton>
#include <QHBoxLayout>
Client::Client(QWidget *parent)
    : QWidget(parent)
{
    _socket = new QTcpSocket(this);

    _lineEdit = new QLineEdit(this);
    QPushButton *sendButton = new QPushButton("send");
    connect(sendButton, SIGNAL(clicked()), this, SLOT(slotSendButtonClick()));
    connect(_lineEdit, SIGNAL(returnPressed()), this, SLOT(slotSendButtonClick()));
    
    QHBoxLayout *lay = new QHBoxLayout(this);
    lay->addWidget(_lineEdit);
    lay->addWidget(sendButton);

    _isConnected = false;
}

void Client::slotSendButtonClick()
{
    if (!_isConnected)
    {
        _socket->connectToHost("127.0.0.1", 9988);
        _isConnected = true;
    }
    QString text = _lineEdit->text();
    if (!text.isEmpty())
    {
        _socket->write(text.toUtf8());//发送数据
        _lineEdit->clear();
    }
}

服务端

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
class QTextBrowser;
class Server :public QWidget
{
    Q_OBJECT
public:
    Server(QWidget *parent);
public slots:
    void slotCurrentIndexChanged(const QString&);
    void slotNewConnection();
private:
    QTcpServer *_server;
    QTcpSocket *_socket;
    QTextBrowser *_textBrowser;
};
#include "server.h"
#include <QHostAddress>
#include <QTextBrowser>
#include <QByteArray>
#include <QGridLayout>
#include <QNetworkInterface>
#include <QComboBox>
Server::Server(QWidget *parent)
{
    _server = new QTcpServer(this);
    //_server->listen(QHostAddress::Any, 9988);//监听跟本主机相连的所有网口
    connect(_server, SIGNAL(newConnection()),this, SLOT(slotNewConnection()) );

    QList<QHostAddress> addrList = QNetworkInterface::allAddresses();
    QComboBox *comboBox = new QComboBox;
    for (const QHostAddress& addr : addrList)
    {
        quint32 ipAddr = addr.toIPv4Address();
        if (ipAddr != 0)
        {
            comboBox->addItem(QHostAddress(ipAddr).toString());
        }
    }
    connect(comboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotCurrentIndexChanged(const QString&)));


    _textBrowser = new QTextBrowser(this);
    QGridLayout *lay = new QGridLayout(this);
    lay->addWidget(comboBox, 0, 0);
    lay->addWidget(_textBrowser,1,0);
}

void Server::slotCurrentIndexChanged(const QString& item)
{
    if (!_server->isListening())
    {
        _server->listen(QHostAddress(item), 9988);
    }
    
    _textBrowser->append("listen...");
}

void Server::slotNewConnection()
{
    _textBrowser->append("connecting...");
    while (_server->hasPendingConnections())//必须处理完所有的连接,否则有新连接时就不会在发信号过来
    {
        _socket = _server->nextPendingConnection();
        connect(_socket, &QTcpSocket::readyRead, [&]() {
            _textBrowser->append("receive message...");
            QByteArray newMessage = _socket->readAll();
            _textBrowser->append(QString(newMessage));
        });
    }
}

使用效果

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

相关文章

  • C++指针与数组:指针详解

    C++指针与数组:指针详解

    本文从初学者的角度,深入浅出地讲解C++中的指针、数组指针,对最常混淆的引用传递、值传递和指针传递做了区处,需要的朋友可以参考下
    2021-09-09
  • linux下实现的2048游戏示例分享

    linux下实现的2048游戏示例分享

    这篇文章主要介绍了linux下实现的2048游戏示例,需要的朋友可以参考下
    2014-04-04
  • C++图形界面开发Qt教程:嵌套圆环示例

    C++图形界面开发Qt教程:嵌套圆环示例

    这篇文章主要介绍了C++实现图形界面开发Qt教程,涉及坐标函数的应用及图形界面程序设计,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08
  • C语言数据(整数、浮点数)在内存中的存储

    C语言数据(整数、浮点数)在内存中的存储

    之前对c语言数据存储一直不太明白,最近仔细研究了一番,所以下面这篇文章主要给大家介绍了关于C语言数据(整数、浮点数)在内存中存储的相关资料,需要的朋友可以参考下
    2021-06-06
  • 带你了解C++中的sort函数

    带你了解C++中的sort函数

    这篇文章主要给大家介绍了关于C++中sort函数的基础入门使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2021-08-08
  • QT实现TCP网络聊天室

    QT实现TCP网络聊天室

    这篇文章主要为大家详细介绍了QT实现TCP网络聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言中printf()缓冲问题详解

    C语言中printf()缓冲问题详解

    这篇文章主要给大家介绍了关于C语言中printf()缓冲问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • C++11之后的decltype类型指示符详解

    C++11之后的decltype类型指示符详解

    为了满足这一要求,C++11 新标准引入了另一种类型说明符 decltype ,它的作用是选择并返回操作数的数据类型,这篇文章主要介绍了C++11之后的decltype类型指示符,需要的朋友可以参考下
    2023-01-01
  • 如何用C语言画一个“圣诞树”

    如何用C语言画一个“圣诞树”

    这篇文章主要介绍了如何用C语言画一个“圣诞树”,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Visual Studio Code安装和配置的教程

    Visual Studio Code安装和配置的教程

    这篇文章主要介绍了Visual Studio Code安装和配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论