Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ QAbstractSocket, ΠΊΠ»Π°ΡΡ QUdpSocket Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΈΠΌΠ΅Π½Π° Ρ ΠΎΡΡΠΎΠ², Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΈΡ ΡΠΈΡΠ»ΠΎΠ²ΡΠ΅ Π°Π΄ΡΠ΅ΡΠ°. ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΠΌΡ Ρ ΠΎΡΡΠ° ΠΏΠΎ Π΅Π³ΠΎ Π°Π΄ΡΠ΅ΡΡ IP, ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π²Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΡΠ»ΠΈ ΠΌΡ Π³ΠΎΡΠΎΠ²Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ°, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ QHostInfo::fromName(). Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ QHostInfo::lookupHost(), ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠ»ΠΎΡ Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° QHostInfo, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ°.
01 int main(int argc, char *argv[])
02 {
03 QApplication app(argc, argv);
04 WeatherBalloon balloon;
05 balloon.show();
06 return app.exec();
07 }
Π€ΡΠ½ΠΊΡΠΈΡ main() ΠΏΡΠΎΡΡΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ WeatherBalloon, ΠΊoΡopΡΠΉ ΡΠ²Π»ΡeΡcΡ yΡacΡΠ½ΠΈΠΊΠΎΠΌ ΡΠ²ΡΠ·ΠΈ ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ UDP ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π½Π° ΡΠΊΡΠ°Π½Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ QPushButton. ΠΠ°ΠΆΠΈΠΌΠ°Ρ ΠΊΠ½ΠΎΠΏΠΊΡ QPushButton, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Weather Station.
01 class WeatherStation : public QDialog
02 {
03 Q_OBJECT
04 public:
05 WeatherStation(QWidget *parent = 0);
06 private slots:
07 void processPendingDatagrams();
08 private:
09 QUdpSocket udpSocket;
10 QLabel *dateLabel;
11 QLabel *timeLabel;
12 QLineEdit *altitudeLineEdit;
13 };
ΠΠ»Π°ΡΡ WeatherStation Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ QDialog. ΠΠ½ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΡ UDP, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ (ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Weather Balloon) ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π° ΡΠΊΡΠ°Π½ ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΏΡΡΠΈ ΡΡΡΠΎΠΊ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ QLineEdit, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° Π΄Π°Π½Π½ΡΡ . ΠΠ΄Π΅ΡΡ Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°ΠΊΡΡΡΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ udpSocket ΡΠΈΠΏΠ° QUdpSocket, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° Π΄Π»Ρ ΠΏΡΠΈΠ΅ΠΌΠ° Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ.
01 WeatherStation::WeatherStation(QWidget *parent)
02 : QDialog(parent)
03 {
04 udpSocket.bind(5824);
05 connect(&udpSocket, SIGNAL(readyRead()),
06 this, SLOT(processPendingDatagrams()));
07 }
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΌΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° QUdpSocket ΠΊ ΠΏΠΎΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠ΅ΠΎΠ·ΠΎΠ½Π΄. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π½Π΅ ΡΠΊΠ°Π·Π°Π»ΠΈ Π°Π΄ΡΠ΅Ρ Ρ ΠΎΡΡΠ°, ΡΠΎΠΊΠ΅Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΡΠ»Π°Π½Π½ΡΠ΅ Π½Π° Π»ΡΠ±ΠΎΠΉ Π°Π΄ΡΠ΅Ρ IP, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠΉ ΠΌΠ°ΡΠΈΠ½Π΅, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Station. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΠΈΠ³Π½Π°Π» ΡΠΎΠΊΠ΅ΡΠ° readyRead() c Π·Π°ΠΊΡΡΡΡΠΌ ΡΠ»ΠΎΡΠΎΠΌ processPendingDatagrams(), ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΈΡ Π½Π° ΡΠΊΡΠ°Π½Π΅.
01 void WeatherStation::processPendingDatagrams()
02 {
03 QByteArray datagram;
04 do {
05 datagram.resize(udpSocket.pendingDatagramSize());
06 udpSocket.readDatagram(datagram.data(), datagram.size());
07 } while (udpSocket.hasPendingDatagrams());
08 QDateTime dateTime;
09 double temperature;
10 double humidity;
11 double altitude;
12 QDataStream in(&datagram, QIODevice::ReadOnly);
13 in.setVersion(QDataStream::Qt_4_1);
14 in >> dateTime >> temperature >> humidity >> altitude;
15 dateLineEdit->setText(dateTime.date().toString());
16 timeLineEdit->setText(dateTime.time().toString());
17 temperatureLineEdit->setText(tr("%1Β° C").arg(temperature));
18 humidityLineEdit->setText(tr("%1%").arg(humidity));
19 altitudeLineEdit->setText(tr("%1 m").arg(altitude));
20 }
Π‘Π»ΠΎΡ processPendingDatagrams() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ. QUdpSocket ΡΡΠ°Π²ΠΈΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠΎΡΡΡΠΏΠΈΠ²ΡΠΈΠ΅ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΊ Π½ΠΈΠΌ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΠ±ΡΡΠ½ΠΎ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ°, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ Π΄ΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠΈΠ³Π½Π°Π»Π° readyRead(). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ, ΠΊΡΠΎΠΌΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π°ΡΠΌΠΎΡΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
Π€ΡΠ½ΠΊΡΠΈΡ pendingDatagramSize() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΆΠ΄ΡΡΠ΅ΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΡΡΠ»Π°ΡΡΡΡ ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½ΡΡ . ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈ Π»ΡΠ±ΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ Π±Π°ΠΉΡΠΎΠ² Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ° Π±ΡΠ΄Π΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ. ΠΡΠ·ΠΎΠ² readDatagram() ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΆΠ΄ΡΡΠ΅ΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π±ΡΡΠ΅Ρ char * (ΠΎΠ±ΡΠ΅Π·Π°Ρ Π΄Π°Π½Π½ΡΠ΅, Π΅ΡΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΌ) ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠΉ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ΅. ΠΠΎΡΠ»Π΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ ΠΌΡ ΡΠ°Π·Π±ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΈΠ· Π½ΠΈΡ (ΠΈΠΌΠ΅ΡΡΡΡ ΡΠ°ΠΌΡΠ΅ ΡΠ²Π΅ΠΆΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π°ΡΠΌΠΎΡΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ) Π½Π° ΡΠΎΡΡΠ°Π²Π½ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ QLineEdit Π½ΠΎΠ²ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ.
01 int main(int argc, char *argv[])
02 {
03 QApplication app(argc, argv);
04 WeatherStation station;
05 station.show();
06 return app.exec();
07 }
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π² ΡΡΠ½ΠΊΡΠΈΠΈ main() ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ WeatherStation.
ΠΠ° ΡΡΠΎΠΌ ΠΌΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΏΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΈ ΠΏΡΠΈΠ΅ΠΌΡ Π΄Π°Π½Π½ΡΡ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° UDP. ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΠ΅Π½Ρ, ΠΏΡΠΈΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Balloon ΠΏΠΎΡΡΠ»Π°Π΅Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ, Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Station ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΈΡ . Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΊΠ°ΠΊ ΡΡΠΈΡΡΠ²Π°ΡΡ, ΡΠ°ΠΊ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΡΠ²ΠΎΠΉ ΡΠΎΠΊΠ΅Ρ. Π€ΡΠ½ΠΊΡΠΈΡΠΌ QUdpSocket::writeDatagram() ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Π°Π΄ΡΠ΅Ρ Ρ ΠΎΡΡΠ° ΠΈ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ QUdpSocket ΠΌΠΎΠΆΠ΅Ρ ΡΠΈΡΠ°ΡΡ Ρ Ρ ΠΎΡΡΠ° ΠΈ ΠΏΠΎΡΡΠ°, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΠ½ Π±ΡΠ» ΡΠ²ΡΠ·Π°Π½ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ bind(), ΠΈ ΠΏΠΈΡΠ°ΡΡ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΠΎΠΉ Ρ ΠΎΡΡ ΠΈ ΠΏΠΎΡΡ.
ΠΠ»Π°Π²Π° 15. XML
XML (Extensible Markup Language β ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ·ΡΠΊ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ) β ΡΡΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠΈΡΠΎΠΊΠΎΠ΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ ΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ . Qt ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π΄Π²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² XML; ΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π²Ρ ΠΎΠ΄ΡΡ Π² ΡΠΎΡΡΠ°Π² ΠΌΠΎΠ΄ΡΠ»Ρ QtXml:
β’ SAX (Simple API for XML β ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² XML) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Β«ΡΠΎΠ±ΡΡΠΈΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Β» Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ .
β’ DOM (Document Object Model β ΠΎΠ±ΡΠ΅ΠΊΡΠ½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°) ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ XML Π² ΡΡΡΡΠΊΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ Π΄Π΅ΡΠ΅Π²Π°, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΡΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΊΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ DOM ΠΈ SAX. SAX ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±ΡΡΡΡΠ΅Π΅, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΡΠΌ ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΡΡΡ Π·Π°Π΄Π°Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ XML Π²ΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Π³Π°), ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ DOM ΠΏΠ΅ΡΠ΅Π²Π΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ Π² SAX.
Π‘ΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ XML ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΡΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ: ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ XML Π²ΡΡΡΠ½ΡΡ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² Π²ΠΈΠ΄Π΅ Π΄Π΅ΡΠ΅Π²Π° DOM, ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΠΈ Β«ΠΏΠΎΠΏΡΠΎΡΠΈΡΡΒ» ΡΡΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ΅Π±Ρ Π² ΡΠ°ΠΉΠ».
Π§ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² XML ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° SAX
SAX ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² XML.
ΠΠ»Π°ΡΡΡ Qt Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° SAX ΠΌΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ SAX2 Java Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΡΠ»ΠΈΡΠΈΡΠΌΠΈ Π² Π½Π°Π·Π²Π°Π½ΠΈΡΡ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ½ΡΡΡΡ Π² Qt ΠΏΡΠ°Π²ΠΈΠ» ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ ΠΈΡ ΡΠ»Π΅Π½ΠΎΠ². ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ SAX ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π² ΡΠ΅ΡΠΈ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://www.saxproject.org/.
Qt ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° SAX ΠΏΠ°ΡΡΠ΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ² XML, Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΠΈΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΈΡ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ QXmlSimpleReader. ΠΡΠΎΡ ΠΏΠ°ΡΡΠ΅Ρ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ XML ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½ XML. ΠΠΎΠ³Π΄Π° ΠΏΠ°ΡΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, ΠΎΠ½ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ βΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°Ρ , ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡΠΈΡ ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ Π² Ρ ΠΎΠ΄Π΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°. (ΠΡΠΈ ΡΠΎΠ±ΡΡΠΈΡ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ Qt, ΠΊΠ°ΠΊ ΡΠΎΠ±ΡΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΈ ΡΠΎΠ±ΡΡΠΈΡ ΠΌΡΡΠΊΠΈ.) ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΡΡΡ ΠΏΠ°ΡΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π°Π½Π°Π»ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° XML:
<doc>
<quote> Ars longa vita brevis</quote>
</doc>
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ°ΡΡΠ΅Ρ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°:
startDocument()
startElement("doc")
startElement("quote")
characters("Ars longa vita brevis")
endElement("quote")
endElement("doc")
endDocument()
ΠΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π²ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ Π² ΠΊΠ»Π°ΡΡΠ΅ QXmlContentHandler. ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΌΡ Π½Π΅ ΡΡΠ°Π»ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ startElement() ΠΈ endElement().
QXmlContentHandler β ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ²βΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ ΠΊΠ»Π°ΡΡΠΎΠΌ QXmlSimpleReader. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ QXmlEntityResolver, QXmlDTDHandler, QXmlErrorHandler, QXmlDeclHandler ΠΈ QXmlLexicalHandler. ΠΡΠΈ ΠΊΠ»Π°ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΠΈΡΡΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΠ±ΡΡΠΈΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΈΡΡ ΠΊΠ»Π°ΡΡΡ QXmlContentHandler ΠΈ QXmlErrorHandler.