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());
}

你可能感兴趣的:(#,▶,Qt扫盲,Qt网络编程,QTcpSocket理论,Qt,tcp通信简述,tcp,简述,tcp/ip)