一、概述
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());
}