QT之QUdpSocket學習
最近,因為公司的專案要求,需要用到 socket 的 udp 通信協議,特意學習了一下,這里分享給大家,
一、QT 的 socket 家族
這里首先給大家介紹一下 QT 的 socket 家族,結構圖大致如下圖所示:

最主要的是 QAbstractSocket 類,它是 QUdpSocket 和 QTcpSocket 的父類,QTcpSocket 類又包含了兩個子類 QSctpSocket 和 QSslSocket,
二、QUdpSocket 的使用
以下為使用步驟:
- 在 pro 或者 pri檔案中引入QT 的 network 網路模塊:
//修改之前
QT += core gui
//修改之后
QT += core gui network
- 在檔案頭部或者頭檔案中引入 QUdpSocket 模塊:
#include<QUdpSocket>
- 定義兩個 QUdpSocket 指標物件,并初始化:
QUdpSocket* send_udp = new QUdpSocket(this);
QUdpSocket* receive_udp = new QUdpSocket(this);
4)使用 udp 協議接收資料,用的 qDebug() 將接收到的資料列印到終端,這里提供兩種方式:
方法一:使用 receiveDatagram() 函式接收資料,接收到的中文資料需要解碼,否則為16進制資料
//設定接收監聽地址和埠,這里用的是本機ip
receive_udp -> bind(QHostAddress::LocalHost, 8088);
//系結監聽事件
connect(receive_udp, &QUdpSocket::readyRead, [this](){
while (receive_udp -> hasPendingDatagrams()) {
datagram = receive_udp -> receiveDatagram();
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
qDebug() << utf8 -> toUnicode(datagram.data());
}
});
方法二:使用 readDatagram() 和 pendingDatagramSize() 函式接收資料,接收到的資料無需解碼即可使用
//設定接收監聽地址和埠,這里用的是本機ip
receive_udp -> bind(QHostAddress::LocalHost, 8088);
//系結監聽事件
connect(receive_udp, &QUdpSocket::readyRead, [this](){
while (receive_udp -> hasPendingDatagrams()) {
int size = int(receive_udp -> pendingDatagramSize());
char* pBuffer = new char[size + 1];//分配報文大小的記憶體
memset(pBuffer, 0, size + 1);
receive_udp->readDatagram(pBuffer, size);
qDebug() << pBuffer;
}
});
- 使用 udp 協議發送資料:
QString s = "";//字串的型別可以根據需要自行定義
//writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)
//該方式發送資料,接收到的中文亂碼且解碼后少字
send_udp -> writeDatagram(s.toStdString().c_str(), s.length(), QHostAddress::LocalHost, 8088);
//writeDatagram(const QByteArray & datagram, const QHostAddress & host, quint16 port)
//需要發中文,建議使用以下方式
send_udp -> writeDatagram(s.toUtf8(), QHostAddress::LocalHost, 8088);
- 這里有一個寫好的案例可以參考 BDYSocket.zip


三、注意事項
- 監聽埠最好使用 1024 以上的,1024 以下的一般都是給系統用的;
- 發送中文資料用 QByteArray 型別資料,使用字符陣列接識訓亂碼;
- 使用 receiveDatagram() 函式接收中文資料時,需要對資料進行解碼,否則出來的是十六進制資料;
- 使用 UDP 協議收發資料注意一定要先開啟接收監聽,然后在發送資料,否則收不到資料的,
接觸QT的時間不長,目前差不多有兩個月了,有不足之處,歡迎大佬指出來,我會進行更正,有問題可以發送郵件至 mjzhutianxiu@163.com ,不定時上線查收,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/206154.html
標籤:其他
上一篇:二哈實作人臉識別
