1. 程式人生 > >Qt實現UDP通訊簡例

Qt實現UDP通訊簡例

參考

目標

終極目標是完成計網課設:基於P2P的區域網即時通訊系統
然而…第一次接觸 Qt,完全沒有概念,希望有個儘量簡單的例子見識一下 Qt 網路程式設計的套路。看完參考的例子後學寫了一波。

特點

  • 只有一邊傳送、另一邊接收,且都在本地
  • 沒有圖形介面,就黑框框

Tips

  • Qt 版本:5.8
  • .pro 檔案裡要加一句:QT += network,接著一定要 執行qmake
  • 約定用 2333 號埠(隨便啦)
  • 測試時要在本機啟動兩個程式,就把傳送端和接收段放在兩個工程裡,分別置為活動工程、執行,就可以啟動兩個了
  • singals 和 slots 其實就是普通的成員函式,見上面 Qt 訊號槽的實現
    的連結中帶有魔法的巨集
  • bind() 大概是使用那個埠的意思,就從那埠讀資料
  • 一旦埠收到資料,就會emit一個叫readyRead()的訊號,然後那些connect()readyRead()的槽(例中的receive())就會收到通知(被呼叫),然後進行相應的操作(函式體)

原始碼

傳送端

main.cpp

#include <QByteArray>
#include <QCoreApplication>
#include <QHostAddress>
#include <QUdpSocket>

const quint16 PORT = 2333
; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QUdpSocket qus; // qus.bind(QHostAddress("127.0.0.1"), PORT+1); QByteArray msg = "Hello world!"; std::cout << "--- Sender ---" << std::endl; for(int i=0; i<100; ++i) qus.writeDatagram(msg, QHostAddress("127.0.0.1"
), PORT); return a.exec(); }

接收端

UdpReceiver.h

#ifndef UDPRECEIVER_H
#define UDPRECEIVER_H

#include <QObject>
#include <QUdpSocket>

class UdpReceiver : public QObject
{
    Q_OBJECT

public:
    UdpReceiver(QObject *p = 0);
    ~UdpReceiver();

public slots:
    void receive();

private:
    QUdpSocket *uSocket;
};

#endif // UDPRECEIVER_H

UdpReceiver.cpp

#include <QByteArray>
#include <iostream>
#include "UdpReceiver.h"

const quint16 PORT = 2333;

UdpReceiver::UdpReceiver(QObject *p) :
    QObject(p)
{
    uSocket = new QUdpSocket;
    uSocket->bind(QHostAddress("127.0.0.1"), PORT);
    connect(uSocket, SIGNAL(readyRead()), this, SLOT(receive()));
}

UdpReceiver::~UdpReceiver()
{
    delete uSocket;
}

void UdpReceiver::receive()
{
    QByteArray ba;
    while(uSocket->hasPendingDatagrams())
    {
        ba.resize(uSocket->pendingDatagramSize());
        uSocket->readDatagram(ba.data(), ba.size());
        std::cout << ba.data() << std::endl;
    }
}

main.cpp

#include <QCoreApplication>
#include "udpreceiver.h"
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    UdpReceiver ur;
    std::cout << "--- Recevier ---" << std::endl;

    return a.exec();
}

截圖

工程

工程截圖

qmake

qmake

效果

效果圖