source: branches/4.5.1/doc/src/examples/fortuneserver.qdoc

Last change on this file was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 5.5 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information (qt-info@nokia.com)
5**
6** This file is part of the documentation of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** 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 are unsure which license is appropriate for your use, please
37** contact the sales department at qt-sales@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \example network/fortuneserver
44 \title Fortune Server Example
45
46 The Fortune Server example shows how to create a server for a simple
47 network service. It is intended to be run alongside the
48 \l{network/fortuneclient}{Fortune Client} example or the the
49 \l{network/blockingfortuneclient}{Blocking Fortune Client} example.
50
51 \image fortuneserver-example.png Screenshot of the Fortune Server example
52
53 This example uses QTcpServer to accept incoming TCP connections, and a
54 simple QDataStream based data transfer protocol to write a fortune to the
55 connecting client (from the \l{network/fortuneclient}{Fortune Client}
56 example), before closing the connection.
57
58 \snippet examples/network/fortuneserver/server.h 0
59
60 The server is implemented using a simple class with only one slot, for
61 handling incoming connections.
62
63 \snippet examples/network/fortuneserver/server.cpp 1
64
65 In its constructor, our Server object calls QTcpServer::listen() to set up
66 a QTcpServer to listen on all addresses, on an arbitrary port. In then
67 displays the port QTcpServer picked in a label, so that user knows which
68 port the fortune client should connect to.
69
70 \snippet examples/network/fortuneserver/server.cpp 2
71
72 Our server generates a list of random fortunes that is can send to
73 connecting clients.
74
75 \snippet examples/network/fortuneserver/server.cpp 3
76
77 When a client connects to our server, QTcpServer will emit
78 QTcpServer::newConnection(). In turn, this will invoke our
79 sendFortune() slot:
80
81 \snippet examples/network/fortuneserver/server.cpp 4
82
83 The purpose of this slot is to select a random line from our list of
84 fortunes, encode it into a QByteArray using QDataStream, and then write it
85 to the connecting socket. This is a common way to transfer binary data
86 using QTcpSocket. First we create a QByteArray and a QDataStream object,
87 passing the bytearray to QDataStream's constructor. We then explicitly set
88 the protocol version of QDataStream to QDataStream::Qt_4_0 to ensure that
89 we can communicate with clients from future versions of Qt. (See
90 QDataStream::setVersion().)
91
92 \snippet examples/network/fortuneserver/server.cpp 6
93
94 At the start of our QByteArray, we reserve space for a 16 bit integer that
95 will contain the total size of the data block we are sending. We continue
96 by streaming in a random fortune. Then we seek back to the beginning of
97 the QByteArray, and overwrite the reserved 16 bit integer value with the
98 total size of the array. By doing this, we provide a way for clients to
99 verify how much data they can expect before reading the whole packet.
100
101 \snippet examples/network/fortuneserver/server.cpp 7
102
103 We then call QTcpServer::newPendingConnection(), which returns the
104 QTcpSocket representing the server side of the connection. By connecting
105 QTcpSocket::disconnected() to QObject::deleteLater(), we ensure that the
106 socket will be deleted after disconnecting.
107
108 \snippet examples/network/fortuneserver/server.cpp 8
109
110 The encoded fortune is written using QTcpSocket::write(), and we finally
111 call QTcpSocket::disconnectFromHost(), which will close the connection
112 after QTcpSocket has finished writing the fortune to the network. Because
113 QTcpSocket works asynchronously, the data will be written after this
114 function returns, and control goes back to Qt's event loop. The socket
115 will then close, which in turn will cause QObject::deleteLater() to delete
116 it.
117
118 \sa {Fortune Client Example}, {Threaded Fortune Server Example}
119 */
Note: See TracBrowser for help on using the repository browser.