Qt實現UDP通訊簡例
阿新 • • 發佈:2019-02-14
參考
目標
終極目標是完成計網課設:基於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();
}