doc/src/network-programming/qtnetwork.qdoc
changeset 0 1918ee327afb
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the documentation of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 /*!
       
    43     \group network
       
    44     \title Network Programming API
       
    45     \brief Classes for Network Programming
       
    46 
       
    47     \ingroup groups
       
    48 */
       
    49 
       
    50 /*!
       
    51     \page network-programming.html
       
    52     \title Network Programming
       
    53     \brief An Introduction to Network Programming with Qt
       
    54 
       
    55     The QtNetwork module offers classes that allow you to write TCP/IP clients
       
    56     and servers. it offers classes such as QFtp that implement specific
       
    57     application-level protocols, lower-level classes such as QTcpSocket,
       
    58     QTcpServer and QUdpSocket that represent low level network concepts,
       
    59     and high level classes such as QNetworkRequest, QNetworkReply and
       
    60     QNetworkAccessManager to perform network operations using common protocols.
       
    61 
       
    62     \tableofcontents
       
    63 
       
    64     \section1 Qt's Classes for Network Programming
       
    65 
       
    66     The following classes provide support for network programming in Qt.
       
    67 
       
    68     \annotatedlist network
       
    69 
       
    70     \section1 High Level Network Operations for HTTP and FTP
       
    71 
       
    72     The Network Access API is a collection of classes for performing
       
    73     common network operations. The API provides an abstraction layer
       
    74     over the specific operations and protocols used (for example,
       
    75     getting and posting data over HTTP), and only exposes classes,
       
    76     functions, and signals for general or high level concepts.
       
    77 
       
    78     Network requests are represented by the QNetworkRequest class,
       
    79     which also acts as a general container for information associated
       
    80     with a request, such as any header information and the encryption
       
    81     used. The URL specified when a request object is constructed
       
    82     determines the protocol used for a request.
       
    83     Currently HTTP, FTP and local file URLs are supported for uploading
       
    84     and downloading.
       
    85 
       
    86     The coordination of network operations is performed by the
       
    87     QNetworkAccessManager class. Once a request has been created,
       
    88     this class is used to dispatch it and emit signals to report on
       
    89     its progress. The manager also coordinates the use of
       
    90     \l{QNetworkCookieJar}{cookies} to store data on the client,
       
    91     authentication requests, and the use of proxies.
       
    92 
       
    93     Replies to network requests are represented by the QNetworkReply
       
    94     class; these are created by QNetworkAccessManager when a request
       
    95     is dispatched. The signals provided by QNetworkReply can be used
       
    96     to monitor each reply individually, or developers may choose to
       
    97     use the manager's signals for this purpose instead and discard
       
    98     references to replies. Since QNetworkReply is a subclass of
       
    99     QIODevice, replies can be handled synchronously or asynchronously;
       
   100     i.e., as blocking or non-blocking operations.
       
   101 
       
   102     Each application or library can create one or more instances of
       
   103     QNetworkAccessManager to handle network communication.
       
   104     
       
   105     \section1 Writing FTP Clients with QFtp
       
   106 
       
   107     FTP (File Transfer Protocol) is a protocol used almost exclusively
       
   108     for browsing remote directories and for transferring files.
       
   109 
       
   110     \image httpstack.png FTP Client and Server
       
   111 
       
   112     FTP uses two network connections, one for sending
       
   113     commands and one for transferring data. The
       
   114     FTP protocol has a state and requires the client to send several
       
   115     commands before a file transfer takes place.
       
   116     FTP clients establish a connection
       
   117     and keeps it open throughout the session. In each session, multiple
       
   118     transfers can occur.
       
   119 
       
   120     The QFtp class provides client-side support for FTP. 
       
   121     It has the following characteristics:
       
   122     \list
       
   123 
       
   124     \o \e{Non-blocking behavior.} QFtp is asynchronous.
       
   125     You can schedule a series of commands which are executed later,
       
   126     when control returns to Qt's event loop.
       
   127 
       
   128     \o \e{Command IDs.} Each command has a unique ID number that you
       
   129     can use to follow the execution of the command. For example, QFtp
       
   130     emits the \l{QFtp::commandStarted()}{commandStarted()} and
       
   131     \l{QFtp::commandFinished()}{commandFinished()} signal with the
       
   132     command ID for each command that is executed. 
       
   133 
       
   134     \o \e{Data transfer progress indicators.} QFtp emits signals
       
   135     whenever data is transferred (QFtp::dataTransferProgress(),
       
   136     QNetworkReply::downloadProgress(), and
       
   137     QNetworkReply::uploadProgress()).  You could connect these signals
       
   138     to QProgressBar::setProgress() or QProgressDialog::setProgress(),
       
   139     for example.
       
   140 
       
   141     \o \e{QIODevice support.} The class supports convenient
       
   142     uploading from and downloading to \l{QIODevice}s, in addition to a
       
   143     QByteArray-based API.
       
   144 
       
   145     \endlist
       
   146 
       
   147     There are two main ways of using QFtp. The most common
       
   148     approach is to keep track of the command IDs and follow the
       
   149     execution of every command by connecting to the appropriate
       
   150     signals. The other approach is to schedule all commands at once
       
   151     and only connect to the done() signal, which is emitted when all
       
   152     scheduled commands have been executed. The first approach
       
   153     requires more work, but it gives you more control over the
       
   154     execution of individual commands and allows you to initiate new
       
   155     commands based on the result of a previous command. It also
       
   156     enables you to provide detailed feedback to the user.
       
   157 
       
   158     The \l{network/ftp}{FTP} example
       
   159     illustrates how to write an FTP client.
       
   160     Writing your own FTP (or HTTP) server is possible using the
       
   161     lower-level classes QTcpSocket and QTcpServer.
       
   162 
       
   163     \section1 Using TCP with QTcpSocket and QTcpServer
       
   164 
       
   165     TCP (Transmission Control Protocol) is a low-level network
       
   166     protocol used by most Internet protocols, including HTTP and FTP,
       
   167     for data transfer. It is a reliable, stream-oriented,
       
   168     connection-oriented transport protocol. It is particularly well
       
   169     suited to the continuous transmission of data.
       
   170 
       
   171     \image tcpstream.png A TCP Stream
       
   172 
       
   173     The QTcpSocket class provides an interface for TCP. You can use
       
   174     QTcpSocket to implement standard network protocols such as POP3,
       
   175     SMTP, and NNTP, as well as custom protocols.
       
   176 
       
   177     A TCP connection must be established to a remote host and port
       
   178     before any data transfer can begin. Once the connection has been
       
   179     established, the IP address and port of the peer are available
       
   180     through QTcpSocket::peerAddress() and QTcpSocket::peerPort(). At
       
   181     any time, the peer can close the connection, and data transfer
       
   182     will then stop immediately.
       
   183 
       
   184     QTcpSocket works asynchronously and emits signals to report status
       
   185     changes and errors, just like QNetworkAccessManager and QFtp. It
       
   186     relies on the event loop to detect incoming data and to
       
   187     automatically flush outgoing data. You can write data to the
       
   188     socket using QTcpSocket::write(), and read data using
       
   189     QTcpSocket::read(). QTcpSocket represents two independent streams
       
   190     of data: one for reading and one for writing.
       
   191 
       
   192     Since QTcpSocket inherits QIODevice, you can use it with
       
   193     QTextStream and QDataStream. When reading from a QTcpSocket, you
       
   194     must make sure that enough data is available by calling
       
   195     QTcpSocket::bytesAvailable() beforehand.
       
   196 
       
   197     If you need to handle incoming TCP connections (e.g., in a server
       
   198     application), use the QTcpServer class. Call QTcpServer::listen()
       
   199     to set up the server, and connect to the
       
   200     QTcpServer::newConnection() signal, which is emitted once for
       
   201     every client that connects. In your slot, call
       
   202     QTcpServer::nextPendingConnection() to accept the connection and
       
   203     use the returned QTcpSocket to communicate with the client.
       
   204 
       
   205     Although most of its functions work asynchronously, it's possible
       
   206     to use QTcpSocket synchronously (i.e., blocking). To get blocking
       
   207     behavior, call QTcpSocket's waitFor...() functions; these suspend
       
   208     the calling thread until a signal has been emitted. For example,
       
   209     after calling the non-blocking QTcpSocket::connectToHost()
       
   210     function, call QTcpSocket::waitForConnected() to block the thread
       
   211     until the \l{QTcpSocket::connected()}{connected()} signal has
       
   212     been emitted.
       
   213 
       
   214     Synchronous sockets often lead to code with a simpler flow of
       
   215     control. The main disadvantage of the waitFor...() approach is
       
   216     that events won't be processed while a waitFor...() function is
       
   217     blocking. If used in the GUI thread, this might freeze the
       
   218     application's user interface. For this reason, we recommend that
       
   219     you use synchronous sockets only in non-GUI threads. When used
       
   220     synchronously, QTcpSocket doesn't require an event loop.
       
   221 
       
   222     The \l{network/fortuneclient}{Fortune Client} and
       
   223     \l{network/fortuneserver}{Fortune Server} examples show how to use
       
   224     QTcpSocket and QTcpServer to write TCP client-server
       
   225     applications. See also \l{network/blockingfortuneclient}{Blocking
       
   226     Fortune Client} for an example on how to use a synchronous
       
   227     QTcpSocket in a separate thread (without using an event loop),
       
   228     and \l{network/threadedfortuneserver}{Threaded Fortune Server}
       
   229     for an example of a multithreaded TCP server with one thread per
       
   230     active client.
       
   231 
       
   232     \section1 Using UDP with QUdpSocket
       
   233 
       
   234     UDP (User Datagram Protocol) is a lightweight, unreliable,
       
   235     datagram-oriented, connectionless protocol. It can be used when
       
   236     reliability isn't important. For example, a server that reports
       
   237     the time of day could choose UDP. If a datagram with the time of
       
   238     day is lost, the client can simply make another request.
       
   239 
       
   240     \image udppackets.png UDP Packets
       
   241 
       
   242     The QUdpSocket class allows you to send and receive UDP
       
   243     datagrams. It inherits QAbstractSocket, and it therefore shares
       
   244     most of QTcpSocket's interface. The main difference is that
       
   245     QUdpSocket transfers data as datagrams instead of as a continuous
       
   246     stream of data. In short, a datagram is a data packet of limited
       
   247     size (normally smaller than 512 bytes), containing the IP address
       
   248     and port of the datagram's sender and receiver in addition to the
       
   249     data being transferred.
       
   250 
       
   251     QUdpSocket supports IPv4 broadcasting. Broadcasting is often used
       
   252     to implement network discovery protocols, such as finding which
       
   253     host on the network has the most free hard disk space. One host
       
   254     broadcasts a datagram to the network that all other hosts
       
   255     receive. Each host that receives a request then sends a reply
       
   256     back to the sender with its current amount of free disk space.
       
   257     The originator waits until it has received replies from all
       
   258     hosts, and can then choose the server with most free space to
       
   259     store data. To broadcast a datagram, simply send it to the
       
   260     special address QHostAddress::Broadcast (255.255.255.255), or
       
   261     to your local network's broadcast address.
       
   262 
       
   263     QUdpSocket::bind() prepares the socket for accepting incoming
       
   264     datagrams, much like QTcpServer::listen() for TCP servers.
       
   265     Whenever one or more datagrams arrive, QUdpSocket emits the
       
   266     \l{QUdpSocket::readyRead()}{readyRead()} signal. Call
       
   267     QUdpSocket::readDatagram() to read the datagram.
       
   268 
       
   269     The \l{network/broadcastsender}{Broadcast Sender} and
       
   270     \l{network/broadcastreceiver}{Broadcast Receiver} examples show
       
   271     how to write a UDP sender and a UDP receiver using Qt.
       
   272 
       
   273     \section1 Resolving Host Names using QHostInfo
       
   274 
       
   275     Before establishing a network connection, QTcpSocket and
       
   276     QUdpSocket perform a name lookup, translating the host name
       
   277     you're connecting to into an IP address. This operation is
       
   278     usually performed using the DNS (Domain Name Service) protocol.
       
   279 
       
   280     QHostInfo provides a static function that lets you perform such a
       
   281     lookup yourself. By calling QHostInfo::lookupHost() with a host
       
   282     name, a QObject pointer, and a slot signature, QHostInfo will
       
   283     perform the name lookup and invoke the given slot when the
       
   284     results are ready. The actual lookup is done in a separate
       
   285     thread, making use of the operating system's own methods for
       
   286     performing name lookups.
       
   287 
       
   288     QHostInfo also provides a static function called
       
   289     QHostInfo::fromName() that takes the host name as argument and
       
   290     returns the results. In this case, the name lookup is performed
       
   291     in the same thread as the caller. This overload is useful for
       
   292     non-GUI applications or for doing name lookups in a separate,
       
   293     non-GUI thread. (Calling this function in a GUI thread may cause
       
   294     your user interface to freeze while the function blocks as
       
   295     it performs the lookup.)
       
   296 
       
   297     \section1 Support for Network Proxies
       
   298 
       
   299     Network communication with Qt can be performed through proxies,
       
   300     which direct or filter network traffic between local and remote
       
   301     connections.
       
   302 
       
   303     Individual proxies are represented by the QNetworkProxy class,
       
   304     which is used to describe and configure the connection to a proxy.
       
   305     Proxy types which operate on different levels of network communication
       
   306     are supported, with SOCKS 5 support allowing proxying of network
       
   307     traffic at a low level, and HTTP and FTP proxying working at the
       
   308     protocol level. See QNetworkProxy::ProxyType for more information.
       
   309 
       
   310     Proxying can be enabled on a per-socket basis or for all network
       
   311     communication in an application. A newly opened socket can be
       
   312     made to use a proxy by calling its QAbstractSocket::setProxy()
       
   313     function before it is connected. Application-wide proxying can
       
   314     be enabled for all subsequent socket connections through the use
       
   315     of the QNetworkProxy::setApplicationProxy() function.
       
   316 
       
   317     Proxy factories are used to create policies for proxy use.
       
   318     QNetworkProxyFactory supplies proxies based on queries for specific
       
   319     proxy types. The queries themselves are encoded in QNetworkProxyQuery
       
   320     objects which enable proxies to be selected based on key criteria,
       
   321     such as the purpose of the proxy (TCP, UDP, TCP server, URL request),
       
   322     local port, remote host and port, and the protocol in use (HTTP, FTP,
       
   323     etc.).
       
   324 
       
   325     QNetworkProxyFactory::proxyForQuery() is used to query the factory
       
   326     directly. An application-wide policy for proxying can be implemented
       
   327     by passing a factory to QNetworkProxyFactory::setApplicationProxyFactory()
       
   328     and a custom proxying policy can be created by subclassing
       
   329     QNetworkProxyFactory; see the class documentation for details.
       
   330 */