Программирование поддержки сети в Qt
Оглавление
- Программирование поддержки сети в Qt
- Модель "клиент-сервер"
- Реализация сервера с помощью класса QTcpServer
- Реализация клиента с помощью класса QTcpSocket
- Класс QFtp
- Класс QHttp
Для того, чтобы облегчить создание сетевых кроссплатформенных приложений, разработчики фреймворка 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. Вызов этих методов приведет к ожиданию выполнения операции и заблокирует, на определенное время, исполнение вашей программы. Не рекомендуется вызывать эти методы в потоке графического интерфейса.
Читать далее: Модель "клиент-сервер"