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) β ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΡΠ½ΡΠΌΠΈ Ρ ΠΎΡΡΠ°ΠΌΠΈ.