source: trunk/doc/src/network-programming/qtnetwork.qdoc@ 651

Last change on this file since 651 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

  • Property svn:eol-style set to native
File size: 15.5 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the documentation of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
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** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
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/qftp}{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*/
Note: See TracBrowser for help on using the repository browser.