Qt Socket 通信
Qt UDP
核心步骤和接口:
-
pro文件中添加
QT += network
-
h头文件中添加
#include <QUdpSocket>
#include <QHostAddress>
-
h头文件的类中添加两个套接字(分别用于发送和接收)
class xx : public xx { private: QUdpSocket *pSocketRecvFd; QUdpSocket *pSocketSendFd; };
-
cpp文件中
-
构造函数中添加Recv();函数
-
Recv()函数实现内容:
pSocketRecvFd = new QUdpSocket(this); pScocketRecvFd->bind(port); connect(pSocketRecvFd, SIGNAL(readyRead()), this, SLOT(RecvMsg()));
-
RecvMsg()函数实现内容:
while(pSocketRecvFd->hasPendingDatagrams()){ QByteArray qbRecvBuff; qbRecvBuff.resize(pSocketRecvFd->pendingDatagramSize()); pSocketRecvFd->readDatagram(qbRecvBuff.data(), qbRecvBuff.size()); }
-
发送按钮的响应函数
{ pSocketSendFd = new QUdpSocket(this); QByteArray qbSendBuff; qbSendBuff = ui->textEdit->toPlainText().toUtf8(); pSocketSendFd->writeDatagram(qbSendBuff.data(), qbSendBuff.size(), QHostAddress("127.0.0.1"), port); }
-
Qt TCP
核心步骤和接口:
-
pro文件中添加
QT += network
-
h头文件中添加
#include <QTcpSocket> #include <QTcpServer> #include <QHostAddress>
-
h头文件的类中添加两个套接字(分别用于建立TCP连接、监听和TCP通信)
class xx : public xx { private: QTcpServer *pTcpServer; QTcpSocket *pTcpSocketFd; };
-
cpp文件中(b建立Tcp连接套接字,a监听,c、d接受Tcp通信,e发送Tcp通信)
-
创建按钮监听函数
void MainWindow::on_pushButton_StrListen_clicked() { pTcpServer->listen(QHostAddress::Any, D_NSP_TDYTH_REMOTE_PORT); if(pTcpServer->isListening()){ ui->textEdit_Recv->append("TcpServer 正处于监听状态..."); ui->textEdit_Recv->append("TcpServer 监听IP是:"); ui->textEdit_Recv->append(pTcpServer->serverAddress().toString()); ui->textEdit_Recv->append("TcpServer 监听端口是:"); ui->textEdit_Recv->append(QString::number(pTcpServer->serverPort())); ui->pushButton_StrListen->setEnabled(false); ui->pushButton_StpListen->setEnabled(true); } } void MainWindow::on_pushButton_StpListen_clicked() { if(pTcpServer->isListening()){ pTcpServer->close(); ui->pushButton_StrListen->setEnabled(true); ui->pushButton_StpListen->setEnabled(false); ui->textEdit_Recv->append("服务器关闭连接"); } }
-
构造函数中定义套接字
pTcpServer = new QTcpServer(this); connect(pTcpServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
-
onNewConnection()函数实现
void MainWindow::onNewConnection() { // 创建通信socketFd pTcpSocketFd = pTcpServer->nextPendingConnection(); connect(pTcpSocketFd, SIGNAL(connected()), this, SLOT(onClientConnected())); connect(pTcpSocketFd, SIGNAL(disconnected()), this, SLOT(onClientDisConnected())); connect(pTcpSocketFd, SIGNAL(readyRead()), this, SLOT(onSocketRecvMs())); }
-
三个槽函数的实现
void MainWindow::onClientConnected() { ui->textEdit_Recv->append("*******和客户端已建立连接"); ui->textEdit_Recv->append("*******" + pTcpSocketFd->peerAddress().toString()); ui->textEdit_Recv->append(QString::number(pTcpSocketFd->peerPort())); } void MainWindow::onClientDisConnected() { ui->textEdit_Recv->append("和客户端连接断开"); pTcpSocketFd->deleteLater(); } void MainWindow::onSocketRecvMsg() { // 按行读取 while (pTcpSocketFd->canReadLine()) { ui->textEdit_Recv->append("[in]:" + pTcpSocketFd->readLine()); } }
-
发送按钮槽函数实现
void MainWindow::on_pushButton_Send_clicked() { QString qsSendBuff = ui->lineEdit_SendMsg->text(); QByteArray qbSendBuff = qsSendBuff.toUtf8(); qbSendBuff.append('\n'); ui->textEdit_Send->append("[out]:" + qsSendBuff); ui->lineEdit_SendMsg->clear(); ui->lineEdit_SendMsg->setFocus(); pTcpSocketFd->write(qbSendBuff); }
-
关闭Tcp连接
void MainWindow::on_pushButton_Exit_clicked() { if(pTcpServer->isListening()){ pTcpServer->close(); } exit(0); } void MainWindow::closeEvent(QCloseEvent *event) { if(pTcpServer->isListening()){ pTcpServer->close(); } event->accept(); }
-
演示的截图如下:
QUDP
QTCP
注:Qt 提供的接口通信函数能与基于linux的socket通信函数相互通信!!!
项目实现下载地址:【点击这里】