Qt扫盲- QTcpSocket 理论总结

QTcpSocket 理论总结

一、概述

TCP (Transmission Control Protocol)是一种可靠的、面向流的、面向连接的传输协议。它特别适合于数据的连续传输。

QTcpSocket是QAbstractSocket的一个方便子类,我们一般就是直接使用QTcpSocket的实例来建立TCP连接并传输数据流。但是很多的API函数其实都是直接使用的 QAbstractSocket 类函数,有关详细信息,请参阅QAbstractSocket文档。

也可以参考我之前记录的,Qt扫盲- QAbstractSocket理论总结

注意:QIODevice::Unbuffered模式下不能打开TCP socket。

二、使用

使用也是非常简单的,也即是有两种工作模式,其实就是阻塞和非阻塞的方式,我因为很多情况都是需要使用 GUI 所有一般都是用的 非阻塞式的,也就是用的事件循环,也就是信号槽的功能。阻塞的话一般就是在命令行的情况下使用的多,而且最好不要混用,用一种就好啦。

client.cpp

QTcpSocket *m_TcpClient = new QTcpSocket(this);

//读信号
connect(m_TcpClient, &QTcpSocket::readyRead, this, &MainWindow::slotReadyRecv);

//断开信号
connect(m_TcpClient, &QTcpSocket::disconnected, [=](){
        ui->ReceivePlainText->appendPlainText("Connect Finished!");
});

//按钮绑定发送输入框的数据
connect(ui->SendBtn, &QPushButton::clicked, this, &MainWindow::slotReadySend);

//发送数据
void MainWindow::slotReadySend()
{
    QString sendData = ui->SendPlainText->toPlainText();

    m_TcpClient->write(sendData.toUtf8());
}

sever.cpp

    QTcpServer * m_TcpSever;

    QTcpSocket *m_TcpSocket;//负责通信

    //创建对象
    m_TcpSever = new QTcpServer(this);

    //设置监听
    m_TcpSever->listen(QHostAddress::Any, 10000);

    //为sever绑定连接函数
    connect(m_TcpSever, &QTcpServer::newConnection, this, &MainWindow::slotNewConnect);
    connect(ui->SendBtn, &QPushButton::clicked, this, &MainWindow::slotReadySend);

void MainWindow::slotNewConnect()
{
    //处理客户端请求
    m_TcpSocket= m_TcpSever->nextPendingConnection();

    ui->ReceivePlainText->appendPlainText(QString("receive connect from IP: %1 Port: %2 ").arg(m_TcpSocket->peerName()).arg(m_TcpSocket->peerPort()));

    QString sendText = R"({
                       "config":{
                           "type":"TIMS",
                           "model":"TIMS-2022001",
                           "ver":"1.0.0.1"
                       },
                       "data":{
                           "master_ip":"192.168.3.168",
                           "master_port":3306,
                           "master_user":"root",
                           "master_pwd":"123456",
                           "slave_ip":"192.168.3.169",
                           "slave_port":3306,
                           "slave_user":"root",
                           "slave_pwd":"123456"
                       }
                   })";

    QByteArray sendArray = QByteArray::number(0xAE,16) + sendText.toUtf8() + QByteArray::number(0xE5,16);

    //初试连接发送数据
    m_TcpSocket->write("sendArray");

    //6.连接信号,接受客户端数据
    connect(m_TcpSocket, &QTcpSocket::readyRead, this, &MainWindow::slotReadyRecv);
    connect(m_TcpSocket, &QTcpSocket::disconnected, this, &MainWindow::slotDisconnect);
}

//处理接收数据
void MainWindow::slotReadyRecv()
{
    QString data = QString::fromUtf8(m_TcpSocket->readAll());

    ui->ReceivePlainText->appendPlainText(data);
    ui->ReceivePlainText->appendPlainText("\n-----------------");
}

//按钮点击发送数据
void MainWindow::slotReadySend()
{
    QString sendData = ui->SendPlainText->toPlainText();

    m_TcpSocket->write(sendData.toUtf8());
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳风暴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值