Programación de redes con Qt
El módulo Qt Network ofrece clases que permiten escribir clientes y servidores TCP/IP. Ofrece clases de bajo nivel como QTcpSocket, QTcpServer y QUdpSocket que representan conceptos de red de bajo nivel, y clases de alto nivel como QNetworkRequest, QNetworkReply y QNetworkAccessManager para realizar operaciones de red utilizando protocolos comunes.
Qt Network también proporciona una API para Transport Layer Security (TLS) y funciones de seguridad utilizando un backend TLS nativo, el OpenSSL Toolkit, o cualquier plugin TLS apropiado. Consulte las Clases de Capa de Conexión Segura (SSL ) para más información.
Clases de Qt para Programación en Red
La página Qt Network C++ Classes contiene una lista de las clases C++ en Qt Network.
Operaciones de Red de Alto Nivel para HTTP
La API de Acceso a Red es una colección de clases para realizar operaciones de red comunes. La API proporciona una capa de abstracción sobre las operaciones y protocolos específicos utilizados (por ejemplo, obtener y enviar datos a través de HTTP), y sólo expone clases, funciones y señales para conceptos generales o de alto nivel.
Las peticiones de red están representadas por la clase QNetworkRequest, que también actúa como contenedor general de la información asociada a una petición, como cualquier información de cabecera y el cifrado utilizado. La URL especificada cuando se construye un objeto de petición determina el protocolo utilizado para una petición. Actualmente se admiten HTTP y URL de archivos locales para la carga y descarga.
La coordinación de las operaciones de red la realiza la clase QNetworkAccessManager. Una vez que se ha creado una petición, esta clase se utiliza para enviarla y emitir señales para informar sobre su progreso. El gestor también coordina el uso de cookies para almacenar datos en el cliente, las solicitudes de autenticación y el uso de proxies.
Las respuestas a las solicitudes de red están representadas por la clase QNetworkReply; éstas son creadas por QNetworkAccessManager cuando se envía una solicitud. Las señales proporcionadas por QNetworkReply pueden ser utilizadas para monitorizar cada respuesta individualmente, o los desarrolladores pueden elegir utilizar las señales del gestor para este propósito y descartar las referencias a las respuestas. Dado que QNetworkReply es una subclase de QIODevice, las respuestas pueden gestionarse de forma síncrona o asíncrona; es decir, como operaciones bloqueantes o no bloqueantes.
Cada aplicación o librería puede crear una o más instancias de QNetworkAccessManager para manejar la comunicación de red.
Uso de TCP con QTcpSocket y QTcpServer
TCP (Transmission Control Protocol) es un protocolo de red de bajo nivel utilizado por la mayoría de los protocolos de Internet, incluyendo HTTP y FTP, para la transferencia de datos. Se trata de un protocolo de transporte fiable, orientado al flujo y a la conexión. Es especialmente adecuado para la transmisión continua de datos.

La clase QTcpSocket proporciona una interfaz para TCP. Puede utilizar QTcpSocket para implementar protocolos de red estándar como POP3, SMTP y NNTP, así como protocolos personalizados.
Es necesario establecer una conexión TCP con un host y un puerto remotos antes de que pueda comenzar cualquier transferencia de datos. Una vez establecida la conexión, la dirección IP y el puerto del peer están disponibles a través de QTcpSocket::peerAddress() y QTcpSocket::peerPort(). En cualquier momento, el peer puede cerrar la conexión y la transferencia de datos se detendrá inmediatamente.
QTcpSocket funciona de forma asíncrona y emite señales para informar de cambios de estado y errores, al igual que QNetworkAccessManager. Se basa en el bucle de eventos para detectar los datos entrantes y vaciar automáticamente los salientes. Puedes escribir datos en el socket utilizando QTcpSocket::write(), y leer datos utilizando QTcpSocket::read(). QTcpSocket representa dos flujos de datos independientes: uno para lectura y otro para escritura.
Dado que QTcpSocket hereda de QIODevice, puede utilizarlo con QTextStream y QDataStream. Cuando lea de QTcpSocket, debe asegurarse de que hay suficientes datos disponibles llamando previamente a QTcpSocket::bytesAvailable().
Si necesita gestionar conexiones TCP entrantes (por ejemplo, en una aplicación de servidor), utilice la clase QTcpServer. Llama a QTcpServer::listen() para configurar el servidor, y conéctate a la señal QTcpServer::newConnection(), que se emite una vez por cada cliente que se conecta. En tu slot, llama a QTcpServer::nextPendingConnection() para aceptar la conexión y utiliza el QTcpSocket devuelto para comunicarte con el cliente.
Aunque la mayoría de sus funciones funcionan de forma asíncrona, es posible utilizar QTcpSocket de forma síncrona (es decir, bloqueante). Para obtener un comportamiento de bloqueo, llame a las funciones waitFor...() de QTcpSocket; éstas suspenden el hilo de llamada hasta que se haya emitido una señal. Por ejemplo, después de llamar a la función no bloqueante QTcpSocket::connectToHost(), llame a QTcpSocket::waitForConnected() para bloquear el hilo hasta que se emita la señal connected().
Los sockets síncronos a menudo conducen a un código con un flujo de control más simple. La principal desventaja del enfoque waitFor...() es que los eventos no serán procesados mientras una función waitFor...() esté bloqueando. Si se utiliza en el hilo GUI, esto podría congelar la interfaz de usuario de la aplicación. Por esta razón, recomendamos que utilices sockets síncronos sólo en subprocesos no GUI. Cuando se utiliza de forma sincrónica, QTcpSocket no requiere un bucle de eventos.
Los ejemplos de Cliente Fortune y Servidor Fortune muestran cómo usar QTcpSocket y QTcpServer para escribir aplicaciones cliente-servidor TCP. Vea también Blocking Fortune Client para un ejemplo de cómo usar un QTcpSocket síncrono en un hilo separado (sin usar un bucle de eventos), y Threaded Fortune Server para un ejemplo de un servidor TCP multihilo con un hilo por cliente activo.
Usando UDP con QUdpSocket
UDP (User Datagram Protocol) es un protocolo ligero, poco fiable, orientado a datagramas y sin conexión. Puede utilizarse cuando la fiabilidad no es importante. Por ejemplo, un servidor que informa de la hora del día podría elegir UDP. Si se pierde un datagrama con la hora, el cliente puede simplemente hacer otra petición.

La clase QUdpSocket permite enviar y recibir datagramas UDP. Hereda de QAbstractSocket, por lo que comparte la mayor parte de la interfaz de QTcpSocket. La principal diferencia es que QUdpSocket transfiere datos como datagramas en lugar de como un flujo continuo de datos. En resumen, un datagrama es un paquete de datos de tamaño limitado (normalmente inferior a 512 bytes), que contiene la dirección IP y el puerto del remitente y el destinatario del datagrama, además de los datos que se transfieren.
QUdpSocket soporta la difusión IPv4. La difusión se utiliza a menudo para implementar protocolos de descubrimiento de red, como encontrar qué host de la red tiene más espacio libre en el disco duro. Un host emite un datagrama a la red que reciben todos los demás hosts. Cada host que recibe una solicitud envía entonces una respuesta al remitente con su cantidad actual de espacio libre en disco. El emisor espera hasta haber recibido las respuestas de todos los hosts, y entonces puede elegir el servidor con más espacio libre para almacenar los datos. Para difundir un datagrama, basta con enviarlo a la dirección especial QHostAddress::Broadcast (255.255.255.255), o a la dirección de difusión de su red local.
QUdpSocket::bind() prepara el socket para aceptar datagramas entrantes, de forma similar a QTcpServer::listen() para los servidores TCP. Cada vez que llegan uno o más datagramas, QUdpSocket emite la señal readyRead(). Llame a QUdpSocket::readDatagram() para leer el datagrama.
Los ejemplos Broadcast Sender y Broadcast Receiver muestran cómo escribir un emisor UDP y un receptor UDP utilizando Qt.
QUdpSocket también soporta multidifusión. Los ejemplos Multicast Sender y Multicast Receiver muestran cómo escribir clientes UDP multicast.
Resolviendo Nombres de Host Usando QHostInfo
Antes de establecer una conexión de red, QTcpSocket y QUdpSocket realizan una búsqueda de nombres, traduciendo el nombre del host al que se está conectando en una dirección IP. Esta operación suele realizarse mediante el protocolo DNS (Domain Name Service).
QHostInfo proporciona una función estática que te permite realizar dicha búsqueda tú mismo. Llamando a QHostInfo::lookupHost() con un nombre de host, un puntero QObject y una firma de ranura, QHostInfo realizará la búsqueda del nombre e invocará la ranura dada cuando los resultados estén listos. La búsqueda real se realiza en un hilo separado, haciendo uso de los métodos propios del sistema operativo para realizar búsquedas de nombres.
QHostInfo también proporciona una función estática llamada QHostInfo::fromName() que toma el nombre del host como argumento y devuelve los resultados. En este caso, la búsqueda de nombres se realiza en el mismo subproceso que la llamada. Esta sobrecarga es útil para aplicaciones no GUI o para realizar búsquedas de nombres en un hilo separado, no GUI. (Llamar a esta función en un subproceso GUI puede causar que tu interfaz de usuario se congele mientras la función se bloquea mientras realiza la búsqueda).
Soporte para proxies de red
La comunicación de red con Qt puede realizarse a través de proxies, que dirigen o filtran el tráfico de red entre conexiones locales y remotas.
Los proxies individuales están representados por la clase QNetworkProxy, que se utiliza para describir y configurar la conexión a un proxy. Se soportan tipos de proxy que operan en diferentes niveles de comunicación de red, con soporte SOCKS 5 que permite el proxy del tráfico de red a bajo nivel, y proxy HTTP y FTP que funcionan a nivel de protocolo. Para más información, consulte QNetworkProxy::ProxyType.
El proxy puede activarse para cada socket o para todas las comunicaciones de red de una aplicación. Se puede hacer que un socket recién abierto utilice un proxy llamando a su función QAbstractSocket::setProxy() antes de que se conecte. El proxy para toda la aplicación puede habilitarse para todas las conexiones de socket posteriores mediante el uso de la función QNetworkProxy::setApplicationProxy().
Las fábricas de proxy se utilizan para crear políticas para el uso de proxy. QNetworkProxyFactory suministra proxies basados en consultas para tipos de proxy específicos. Las propias consultas se codifican en objetos QNetworkProxyQuery que permiten seleccionar proxies en función de criterios clave, como el propósito del proxy (TCP, UDP, servidor TCP, solicitud de URL), el puerto local, el host y el puerto remotos, y el protocolo en uso (HTTP, FTP, etc.).
QNetworkProxyFactory::proxyForQuery() se utiliza para consultar directamente la fábrica. Se puede implementar una política de proxy para toda la aplicación pasando una fábrica a QNetworkProxyFactory::setApplicationProxyFactory() y se puede crear una política de proxy personalizada subclasificando QNetworkProxyFactory; consulte la documentación de la clase para más detalles.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.