Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 84

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

05 ClientSocket(QObject *parent = 0);

06 private slots:

07 void readClient();

08 private:

09 void generateRandomTrip(const QString &from, const QString &to,

10 const QDate &date, const QTime &time);

11 quint16 nextBlockSize;

12 };

Класс ClientSocket наслСдуСт QTcpSocket ΠΈ инкапсулируСт состояниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

01 ClientSocket::ClientSocket(QObject *parent)

02 : QTcpSocket(parent)

03 {

04 connect(this, SIGNAL(readyRead()), this, SLOT(readClient()));

05 connect(this, SIGNAL(disconnected()), this, SLOT(deleteLater()));

06 nextBlockSize = 0;

07 }

Π’ конструкторС ΠΌΡ‹ устанавливаСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ соСдинСния сигнал—слот ΠΈ Π·Π°Π΄Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ nextBlockSize Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ посланного ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ Π±Π»ΠΎΠΊΠ°.

Π‘ΠΈΠ³Π½Π°Π» disconnected() подсоСдиняСтся ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ deleteLater(), которая наслСдуСтся ΠΎΡ‚ класса QObject, ΠΈ удаляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° управлСния Π² Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий Qt. Π­Ρ‚ΠΎ обСспСчиваСт ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ClientSocket послС закрытия сокСтного соСдинСния.

01 void ClientSocket::readClient()

02 {

03 QDataStream in(this);

04 in.setVersion(QDataStream::Qt_4_1);

05 if (nextBlockSize == 0) {

06 if (bytesAvailable() < sizeof(quint16))

07 return;

08 in >> nextBlockSize;

09 }

10 if (bytesAvailable() < nextBlockSize)

11 return;

12 quint8 requestType;

13 QString from;

14 QString to;

15 QDate date;

16 QTime time;

17 quint8 flag;

18 in >> requestType;

19 if (requestType == 'S') {

20 in >> from >> to >> date >> time >> flag;

21 srand(from.length() * 3600 + to.length() * 60 + time.hour());

22 int numTrips = rand() % 8;

23 for (int i = 0; i < numTrips; ++i)

24 generateRandomTrip(from, to, date, time);

25 QDataStream out(this);

26 out << quint16(0xFFFF);

27 }

28 close();

29 }

Π‘Π»ΠΎΡ‚ readClient() подсоСдиняСтся ΠΊ сигналу readyRead() класса QTcpSocket. Если nextBlockSize Ρ€Π°Π²Π΅Π½ 0, ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ°; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ ΡƒΠΆΠ΅ считан Π½Π°ΠΌΠΈ, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ провСряСм поступлСниС Ρ†Π΅Π»ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. Если это Ρ†Π΅Π»Ρ‹ΠΉ Π±Π»ΠΎΠΊ, ΠΌΡ‹ считываСм Π΅Π³ΠΎ Π·Π° ΠΎΠ΄ΠΈΠ½ шаг. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ QDataStream нСпосрСдствСнно для QTcpSocket (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ this) ΠΈ считываСм поля, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ >>.

ПослС чтСния запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΡ‹ осущСствляли Π±Ρ‹ поиск ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… расписания ΠΆΠ΅Π»Π΅Π·Π½ΠΎΠ΄ΠΎΡ€ΠΎΠΆΠ½Ρ‹Ρ… рСйсов ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ Π±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ подходящиС рСйсы. Но здСсь ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ generateRandomTrip(), которая случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ рСйс. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅ число Ρ€Π°Π· ΠΈ Π·Π°Ρ‚Π΅ΠΌ посылаСм 0xFFFF для обозначСния ΠΊΠΎΠ½Ρ†Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΡ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС.

01 void ClientSocket::generateRandomTrip(const QString & /* ΠΎΡ‚ΠΊΡƒΠ΄Π° */,

02 const QString & /* ΠΊΡƒΠ΄Π° */, const QDate &date, const QTime &time)

03 {

04 QByteArray block;

05 QDataStream out(&block, QIODevice::WriteOnly);

06 out.setVersion(QDataStream::Qt_4_1);

07 quint16 duration = rand() % 200;

08 out << quint16(0) << date << time << duration << quint8(1)

09 << QString("InterCity");

10 out.device()->seek(0);

11 out << quint16(block.size() - sizeof(quint16));

12 write(block);

13 }

Ѐункция generateRandomTrip() дСмонстрируСт способ пСрСсылки Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· соСдинСниС TCP. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sendRequest(). И вновь ΠΌΡ‹ записываСм Π±Π»ΠΎΠΊ Π² массив QByteArray Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π΅Π³ΠΎ ΠΎΡ‚ΠΎΡˆΠ»Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ write().

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 TripServer server;

05 if (!server.listen(QHostAddress::Any, 6178)) {

06 cerr << "Failed to bind to port" << endl;

07 return 1;

08 }

09 QPushButton quitButton(QObject::tr("&Quit"));

10 quitButton.setWindowTitle(QObject::tr("Trip Server"));

11 QObject::connect(&quitButton, SIGNAL(clicked()),

12 &app, SLOT(quit()));

13 quitButton.show();

14 return app.exec();

15 }

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TripServer ΠΈ ΠΊΠ½ΠΎΠΏΠΊΡƒ QPushButton, которая позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сСрвСр. Π Π°Π±ΠΎΡ‚Π° сСрвСра начинаСтся с Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QTcpSocket::listen(), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΉ адрСс IP ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ соСдинСния. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс 0.0.0.0 (QHostAddress::Any) соотвСтствуСт Π½Π°Π»ΠΈΡ‡ΠΈΡŽ любого интСрфСйса IP Π½Π° локальном хостС.

Π­Ρ‚ΠΈΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ систСмы клиСнт—сСрвСр. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π°ΠΌΠΈ использовался Π±Π»ΠΎΠΊΠΎΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° QDataStream для чтСния ΠΈ записи Π΄Π°Π½Π½Ρ‹Ρ…. Если Π±Ρ‹ ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ строкоориСнтированный ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ canReadLine() ΠΈ readLine() класса QTcpSocket Π² слотС, подсоСдинСнном ΠΊ сигналу readyRead():

QStringList lines;

while (tcpSocket.canReadLine())

lines.append(tcpSocket.readLine());

ΠœΡ‹ Π±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΡΡ‡ΠΈΡ‚Π°Π½Π½ΡƒΡŽ строку. ΠŸΠ΅Ρ€Π΅ΡΡ‹Π»ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ с использованиСм QTextStream для QTcpSocket.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Π°Ρ здСсь рСализация сСрвСра Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ эффСктивна Π² случаС, ΠΊΠΎΠ³Π΄Π° соСдинСний ΠΌΠ½ΠΎΠ³ΠΎ. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π½Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ запроса ΠΌΡ‹ Π½Π΅ обслуТиваСм Π΄Ρ€ΡƒΠ³ΠΈΠ΅ соСдинСния. Π‘ΠΎΠ»Π΅Π΅ эффСктивным Π±Ρ‹Π» Π±Ρ‹ запуск Π½ΠΎΠ²ΠΎΠ³ΠΎ процСсса для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ соСдинСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Threaded Fortune Server (ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ сСрвСр, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ интСрСсныС изрСчСния, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Β«fortunesΒ»), располоТСнный Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Qt examples/network/threadedfortuneserver, дСмонстрируСт, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ UDP

Класс QUdpSocket ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ UDP. UDP β€” это Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». НСкоторыС прилоТСния ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UDP, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ с Π½ΠΈΠΌ Π»Π΅Π³Ρ‡Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‡Π΅ΠΌ с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ TCP. По ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ UDP Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ (Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ) ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ хоста ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Для Π½Π΅Π³ΠΎ Π½Π΅ сущСствуСт понятия соСдинСния, ΠΈ Ссли доставка ΠΏΠ°ΠΊΠ΅Ρ‚Π° UDP Π² ΠΏΡƒΠ½ΠΊΡ‚ назначСния Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ сообщСния ΠΎΠ± ошибкС Π½Π΅ пСрСдаСтся ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŽ.

Рис. 14.3. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Station.

ΠœΡ‹ рассмотрим способы примСнСния UDP Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Qt Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Weather Balloon (ΠΌΠ΅Ρ‚Π΅ΠΎΠ·ΠΎΠ½Π΄) ΠΈ Weather Station (мСтСостанция). ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Balloon являСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π±Π΅Π· графичСского интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ посылаСт ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 2 сСкунды Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ UDP с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ атмосфСрного состояния. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Station ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ эти Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΡ… Π½Π° экран. ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с рассмотрСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° прилоТСния Weather Balloon.

01 class WeatherBalloon : public QPushButton

02 {

03 Q_OBJECT

04 public:

05 WeatherBalloon(QWidget *parent = 0);

06 double temperature() const;

07 double humidity() const;

08 double altitude() const;

09 private slots:

10 void sendDatagram();

11 private:

12 QUdpSocket udpSocket;

13 QTimer timer;

14 };

Класс WeatherBalloon наслСдуСт QPushButton. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свою Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° QUdpSocket для обСспСчСния связи с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Weather Station.

01 WeatherBalloon::WeatherBalloon(QWidget *parent)

02 : QPushButton(tr("Quit"), parent)

03 {

03 connect(this, SIGNAL(clicked()), this, SLOT(close()));

04 connect(&timer, SIGNAL(timeout()), this, SLOT(sendDatagram()));

05 timer.start(2 * 1000);

06 setWindowTitle(tr("Weather Balloon"));

07 }

Π’ конструкторС ΠΌΡ‹ запускаСм QTimer для Π²Ρ‹Π·ΠΎΠ²Π° sendDatagram() Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 2 сСкунды.

01 void WeatherBalloon::sendDatagram()

02 {

03 QByteArray datagram;

04 QDataStream out(&datagram, QIODevice::WriteOnly);

05 out.setVersion(QDataStream::Qt_4_1);

06 out << QDateTime::currentDateTime() << temperature()

07 << humidity() << altitude();

08 udpSocket.writeDatagram(datagram, QHostAddress::LocalHost, 5824);

09 }

Π’ sendDatagram() ΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ отсылаСм Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄Π°Ρ‚Ρƒ, врСмя, Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ, Π²Π»Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ высоту Π½Π°Π΄ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ моря.

β€’ QDateTime β€” Π΄Π°Ρ‚Π° ΠΈ врСмя ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ,

β€’ double β€” Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° ΠΏΠΎ ЦСльсию,

β€’ double β€” Π²Π»Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…,

β€’ double β€” высота Π½Π°Π΄ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ моря Π² ΠΌΠ΅Ρ‚Ρ€Π°Ρ….

Π­Ρ‚Π° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° отсылаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QUdpSocket::writeBlock() (Π² ΠΊΠΎΠ΄Π΅ "writeDatagram". wtf?). Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ writeBlock() ΡΠ²Π»ΡΡŽΡ‚ΡΡ адрСс IP ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€Π° (прилоТСния Weather Station). Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Station выполняСтся Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ машинС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Balloon, ΠΈ поэтому ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ адрСс IP 127.0.0.1 (QHostAddress::LocalHost) β€” ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для использования мСстными хостами.