Программирование поддержки сети в Qt


Для того, чтобы облегчить создание сетевых кроссплатформенных приложений, разработчики фреймворка Qt предусмотрели модуль работы с сетью QtNetwork. Модуль QtNetwork содержит как высокоуровневые классы, такие как QHttp или QFtp, так и классы QAbstractSocket, QTcpServer, QUdpSocket, с помощью которых можно работать с сетью на низком уровне.

Сокетное соединение

Сокет — это устройство пересылки данных с одного конца связи на другой. Другой конец может принадлежать процессу, работающему на локальном компьютере, а может располагаться и на удаленном компьютере, подключенному к Интернету и расположенному в другом полушарии Земли. Сокетное соединение — это соединение типа точка-точка (point to point), которое производится между двумя процессами.

Сокеты разделяют на дейтаграммные (datagram) и поточные. Дейтаграммные сокеты осуществляют обмен пакетами данных. Поточные сокеты устанавливают связь и производят потоковый обмен данными через установленную ими связь. На практике, поточные сокеты используются гораздо чаще, чем дейтаграммные из-за того, что-они предоставляют дополнительные механизмы, направленные против искажения и потери данных. Поточные сокеты работают в обоих направлениях, то есть то, что один из процессов записывает в поток, может быть считано процессом на другом конце связи, и наоборот.

Для дейтаграммных сокетов Qt предоставляет класс QUdpSocket, а для поточных — класс QTcpSocket.

Класс QTcpSocket содержит набор методов для работы с TCP (Transmition Control Protocol, протокол управления передачей данных) — это сетевой протокол низкого уровня, являющийся одним из основных протоколов в Интернете. С его помощью можно реализовать поддержку для стандартных сетевых протоколов, таких как: HTTP, FTP, POP3, SMTP, и даже для своих собственных протоколов. Этот класс унаследован от класса QAbstractSocket, который, в свою очередь, наследует класс QIODevice. А это значит, что для доступа (чтения и записи) к его объектам необходимо применять все методы класса QIODevice и использовать классы потоков QDataStream или QTextStream.

Работа класса QTcpSocket асинхронна, что дает возможность избежать блокирования приложения в процессе его работы. Но если вам это не нужно, то можете воспользоваться серией методов, начинающихся со слова waitFor. Вызов этих методов приведет к ожиданию выполнения операции и заблокирует, на определенное время, исполнение вашей программы. Не рекомендуется вызывать эти методы в потоке графического интерфейса.

Читать далее: Модель "клиент-сервер"