Qt Socket 通信(UDP和TCP通信)

Qt Socket 通信

Qt UDP

核心步骤和接口:

  1. pro文件中添加

    QT += network
    
  2. h头文件中添加

#include <QUdpSocket>

#include <QHostAddress>
  1. h头文件的类中添加两个套接字(分别用于发送和接收)

    class xx : public xx
    
    {
    
    private:
    
    ​	QUdpSocket *pSocketRecvFd;
    
    ​	QUdpSocket *pSocketSendFd;
    
    };
    
  2. cpp文件中

    1. 构造函数中添加Recv();函数

    2. Recv()函数实现内容:

      pSocketRecvFd = new QUdpSocket(this);
      
      pScocketRecvFd->bind(port);
      
      connect(pSocketRecvFd, SIGNAL(readyRead()), this, SLOT(RecvMsg()));
      
    3. RecvMsg()函数实现内容:

      while(pSocketRecvFd->hasPendingDatagrams()){
      
      ​	QByteArray qbRecvBuff;
      
      ​	qbRecvBuff.resize(pSocketRecvFd->pendingDatagramSize());
      
      ​	pSocketRecvFd->readDatagram(qbRecvBuff.data(), qbRecvBuff.size());
      
      }
      
    4. 发送按钮的响应函数

         {
      
      ​	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

核心步骤和接口:

  1. pro文件中添加

    QT += network
    
  2. h头文件中添加

    #include <QTcpSocket>
    #include <QTcpServer>
    #include <QHostAddress>
    
  3. h头文件的类中添加两个套接字(分别用于建立TCP连接、监听和TCP通信

    class xx : public xx
    
    {
    
    private:
    
    ​	QTcpServer *pTcpServer;
    
    ​	QTcpSocket *pTcpSocketFd;
    
    };
    
  4. cpp文件中(b建立Tcp连接套接字,a监听,c、d接受Tcp通信,e发送Tcp通信)

    1. 创建按钮监听函数

      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("服务器关闭连接");
          }
      }
      
    2. 构造函数中定义套接字

      pTcpServer = new QTcpServer(this);
      connect(pTcpServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
      
    3. 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()));
      
      }
      
    4. 三个槽函数的实现

      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());
          }
      }
      
    5. 发送按钮槽函数实现

      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);
      
      }
      
    6. 关闭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通信函数相互通信!!!
项目实现下载地址:【点击这里】

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中进行UDPTCP通信的流程和API如下: UDP通信流程: 1. 创建QUdpSocket对象 2. 绑定本地IP地址和端口号 3. 发送数据:使用QHostAddress和quint16参数创建目标地址,使用QUdpSocket的writeDatagram()函数发送数据 4. 接收数据:使用QUdpSocket的readyRead()信号和readDatagram()函数接收数据 UDP通信API: 1. 创建QUdpSocket对象:QUdpSocket *udpSocket = new QUdpSocket(this); 2. 绑定本地IP地址和端口号:udpSocket->bind(QHostAddress::AnyIPv4, port); 3. 发送数据:udpSocket->writeDatagram(data, QHostAddress(targetIP), targetPort); 4. 接收数据:connect(udpSocket, &QUdpSocket::readyRead, this, &MyClass::processPendingDatagrams); void MyClass::processPendingDatagrams() { while (udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize()); udpSocket->readDatagram(datagram.data(), datagram.size()); // 处理接收到的数据 } } TCP通信流程: 1. 创建QTcpServer对象 2. 监听端口号:使用QTcpServer的listen()函数监听端口号 3. 接受连接:使用QTcpServer的newConnection()信号和nextPendingConnection()函数接受连接请求,创建QTcpSocket对象 4. 发送数据:使用QTcpSocket的write()函数发送数据 5. 接收数据:使用QTcpSocket的readyRead()信号和read()函数接收数据 TCP通信API: 1. 创建QTcpServer对象:QTcpServer *tcpServer = new QTcpServer(this); 2. 监听端口号:tcpServer->listen(QHostAddress::AnyIPv4, port); 3. 接受连接: connect(tcpServer, &QTcpServer::newConnection, this, &MyClass::processNewConnection); void MyClass::processNewConnection() { QTcpSocket *clientSocket = tcpServer->nextPendingConnection(); connect(clientSocket, &QTcpSocket::readyRead, this, &MyClass::processReadyRead); } 4. 发送数据:clientSocket->write(data); 5. 接收数据: void MyClass::processReadyRead() { QTcpSocket *clientSocket = qobject_cast<QTcpSocket *>(sender()); QByteArray data = clientSocket->readAll(); // 处理接收到的数据 }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值