一 UDP介紹編程
UDP是一種簡單輕量級的傳輸層協議,提供無鏈接的,不可靠的報文傳輸。適合下面4種狀況:安全
網絡數據大多爲短消息。網絡
擁有大量客戶端。socket
對數據安全性無特殊要求tcp
網絡負擔很是重,但對響應速度要求高。函數
二 基於udp協議的c/s編程模型(廣播),組播的話,明天再看。ui
客戶端:this
class Sender : public QObject { Q_OBJECT //可使用信號和槽 public: explicit Sender(QObject *parent = 0); ~Sender();//虛構函數無返回值 void start(); public slots: void broadcastDatagram(); private: QUdpSocket *udpSocket;//包含 <QtNetwork/qudpsocket.h> QTimer *timer; int messageNo; };
在使用udp tcp時,qt的.pro文件中要加上 QT +=network.spa
具體實現:code
#include "sender.h" Sender::Sender(QObject *parent) : QObject(parent) { timer = new QTimer(this); udpSocket = new QUdpSocket(this); connect(timer,SIGNAL(timeout()),this,SLOT(broadcastDatagram())); messageNo = 1; } void Sender::start() { timer->start(1000); } void Sender::broadcastDatagram() { qDebug()<<(tr("Begin Broadcast: %1").arg(messageNo)); QByteArray datagram = "BroadCast Message:" + QByteArray::number(messageNo); udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,44444); ++messageNo; } Sender::~Sender() { delete timer; delete udpSocket;//是否刪除connect? }
udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,44444);
函數原型:writeDatagram(const char* data,qint64 size,const QHostAddress &address,quint16 port)
函數功能:將數據包發出
函數參數:數據包自身,數據包大小,發送到的地址,端口。
接收端:
class Receiver : public QObject { Q_OBJECT public: explicit Receiver(QObject *parent = 0); ~Receiver(); signals: public slots: void processPendingDatagrams(); private: QUdpSocket *udpSocket; };
具體實現:
#include "receiver.h" Receiver::Receiver(QObject *parent) : QObject(parent) { udpSocket = new QUdpSocket(this); udpSocket->bind(44444); connect(udpSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams())); } void Receiver::processPendingDatagrams() { while(udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize()); udpSocket->readDatagram(datagram.data(),datagram.size()); qDebug() << (tr("Receice Data: \"%1\"").arg(datagram.data())); } } Receiver::~Receiver() { delete udpSocket; }
當接受到數據包時,QUdpSocket會發出readyRead()信號。我關聯了processPendingDatagrams()。
先用hasPendingDatagrams()判斷是否有可供讀取的數據。如有,則用pendingDatagramSize()開闢一個緩衝區。
最後,用readDatagram()將報文讀取到緩衝區中。