...
udp-protokolla on yksinkertaisin tiedonsiirtoprotokolla Ethernetin yli. Se ei vaadi kuittauksia, eikä siten varmista tiedon perille menoa, mutta varmistus voidaan toteuttaa muilla menetelmillä.
Udp-
...
asiakas
Projektitiedostoon täytyy lisätä määrittely network, jotta Qt ottaa mukaan verkkoasetukset
Code Block |
---|
QT += network
|
Otsikkotiedostossa tulee esitellä udpSocket muuttuja
Code Block |
---|
#ifndef UDPASIAKASTOIMINNOT_H #define UDPASIAKASTOIMINNOT_H #include <QObject> #include <QUdpSocket> ... //tehdään osoitinmuuttuja socketia varten //udp funktiot on täällä #include <QDebug> class UdpAsiakasToiminnot : public QObject { Q_OBJECT public: explicit UdpAsiakasToiminnot(QObject *parent = 0); QUdpSocket *udpSocket;udpLiitynta; public slots: void LueDataa(); void KirjoitaDataa(quint32 arvo); }; #endif // UDPASIAKASTOIMINNOT_H |
Koodissa liitetään socket porttiin ja lähetetään dataa
Code Block |
---|
//muodostimeen varaukset ja liitynnät //varataan udpSocket muuttujalle muistia#include "udpasiakastoiminnot.h" UdpAsiakasToiminnot::UdpAsiakasToiminnot(QObject *parent)QObject(parent) { udpSocket udpLiitynta= new QUdpSocket(this); // jos asiakas // liitetään socket porttiinhaluaisi myos lukea, niin myos seuraavat // udpSocketudpLiitynta->bind(4545445401, QUdpSocket::ShareAddress); // connect(udpLiitynta,SIGNAL(readyRead()),this,SLOT(LueDataa())); } void UdpAsiakasToiminnot::LueDataa() { ...} void DialogUdpAsiakasToiminnot::on_sendMessage_clicked(KirjoitaDataa(quint32 arvo) { QVector<quint32> v; QString viesti=ui->lineEdit->text();//luetaan teksti lineEdit ikkunasta v<<(quint32)1;//viestin nimi v<<arvo; //QByteArray on tavuvektori QByteArray datagram; qDebug() <<"kirjoitetaan dataa "<< v; //esitellään muuttuja, joka sisältää tietoa 8:n bitin pätkissä datagram.append(viesti);//lisätään viesti muuttujaanQDataStream tyyppinä voi lähettää perättäistä tietoa io-laittelle QDataStream out (&datagram,QIODevice::WriteOnly); //foreach - kopioi vuorollaan jokainen v:n alkio f muuttujaan ja lisää //kirjoitetaan viesti sockettiin jokainen f out:n jatkoksi foreach(quint32 f,v) { out << f; } udpSocketudpLiitynta->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast,45454 45401); qDebug()<<"data kirjoitettiin"; } |
Udp-
...
palvelin
Projekti- ja otsikkotiedotoihin tehdään samat lisäykset kuin palvelimessa.
Esimerkiksi muodostimessa tehdään taas liitäntä ja liitetään udpSocketin "valmis signaali" tiedon vastaanottajaan.
Ja vielä tehdään tiedolle vastaanottaja.
Code Block |
---|
#ifndef UDPPALVELINTOIMINNOT_H
#define UDPPALVELINTOIMINNOT_H
#include <QObject>
#include <QUdpSocket> //udp funktiot on täällä
class UdpPalvelinToiminnot : public QObject
{
Q_OBJECT
public:
explicit UdpPalvelinToiminnot(QObject *parent = 0);
QUdpSocket *udpLiitynta;
signals:
void Tulokset(qint32);
public slots:
void LueDataa();
};
#endif // UDPPALVELINTOIMINNOT_H
|
Seuraavassa koodissa on esitetty numeerisen datan luku udp-väylältä
Code Block |
---|
#include "udppalvelintoiminnot.h" //#include <QReadLocker> //QReadWriteLock lukulukko; UdpPalvelinToiminnot::UdpPalvelinToiminnot(QObject *parent) : QObject(parent) { udpLiitynta= udpSocket = new QUdpSocket(this); udpSocketudpLiitynta->bind(4545445401, QUdpSocket::ShareAddress); connect(udpSocketudpLiitynta, SIGNAL(readyRead()),this, SLOT(processPendingDatagramsLueDataa())); |
Ja vielä tehdään tiedolle vastaanottaja.
Code Block |
---|
void Dialog::processPendingDatagrams } void UdpPalvelinToiminnot::LueDataa() { //esitellään muuttuja tavujonolle QByteArray datagramqint32 f; //otetaan dataa vastaan niin kaun kuin on tulossaqDebug() << "udpLiitynta"; while (udpSocketudpLiitynta->hasPendingDatagrams()) { QByteArray datagram; //sovitetaan muuttuja tulevaan dataan datagram.resize(udpLiitynta->pendingDatagramSize()); udpLiitynta->readDatagram(datagram.resize(udpSocket->pendingDatagramSizedata(), datagram.size()); //luetaan data muuttujaanQDataStream in(datagram); in>>f; udpSocket->readDatagram(datagram.data(), datagram.size());if(f==(qint32) 1 ) { //esitetään muuttuja näytölläin>>f; ui->label->setText(tr("Received: \"%1\"") .arg(datagram.data())) qDebug()<<"tulokset "<<f; emit Tulokset(f); return; } } } |