~ubuntu-branches/ubuntu/maverick/python3.1/maverick

« back to all changes in this revision

Viewing changes to Doc/library/socketserver.rst

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2009-03-23 00:01:27 UTC
  • Revision ID: james.westby@ubuntu.com-20090323000127-5fstfxju4ufrhthq
Tags: upstream-3.1~a1+20090322
ImportĀ upstreamĀ versionĀ 3.1~a1+20090322

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
:mod:`socketserver` --- A framework for network servers
 
3
=======================================================
 
4
 
 
5
.. module:: socketserver
 
6
   :synopsis: A framework for network servers.
 
7
 
 
8
The :mod:`socketserver` module simplifies the task of writing network servers.
 
9
 
 
10
There are four basic server classes: :class:`TCPServer` uses the Internet TCP
 
11
protocol, which provides for continuous streams of data between the client and
 
12
server.  :class:`UDPServer` uses datagrams, which are discrete packets of
 
13
information that may arrive out of order or be lost while in transit.  The more
 
14
infrequently used :class:`UnixStreamServer` and :class:`UnixDatagramServer`
 
15
classes are similar, but use Unix domain sockets; they're not available on
 
16
non-Unix platforms.  For more details on network programming, consult a book
 
17
such as
 
18
W. Richard Steven's UNIX Network Programming or Ralph Davis's Win32 Network
 
19
Programming.
 
20
 
 
21
These four classes process requests :dfn:`synchronously`; each request must be
 
22
completed before the next request can be started.  This isn't suitable if each
 
23
request takes a long time to complete, because it requires a lot of computation,
 
24
or because it returns a lot of data which the client is slow to process.  The
 
25
solution is to create a separate process or thread to handle each request; the
 
26
:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes can be used to
 
27
support asynchronous behaviour.
 
28
 
 
29
Creating a server requires several steps.  First, you must create a request
 
30
handler class by subclassing the :class:`BaseRequestHandler` class and
 
31
overriding its :meth:`handle` method; this method will process incoming
 
32
requests.  Second, you must instantiate one of the server classes, passing it
 
33
the server's address and the request handler class.  Finally, call the
 
34
:meth:`handle_request` or :meth:`serve_forever` method of the server object to
 
35
process one or many requests.
 
36
 
 
37
When inheriting from :class:`ThreadingMixIn` for threaded connection behavior,
 
38
you should explicitly declare how you want your threads to behave on an abrupt
 
39
shutdown. The :class:`ThreadingMixIn` class defines an attribute
 
40
*daemon_threads*, which indicates whether or not the server should wait for
 
41
thread termination. You should set the flag explicitly if you would like threads
 
42
to behave autonomously; the default is :const:`False`, meaning that Python will
 
43
not exit until all threads created by :class:`ThreadingMixIn` have exited.
 
44
 
 
45
Server classes have the same external methods and attributes, no matter what
 
46
network protocol they use.
 
47
 
 
48
 
 
49
Server Creation Notes
 
50
---------------------
 
51
 
 
52
There are five classes in an inheritance diagram, four of which represent
 
53
synchronous servers of four types::
 
54
 
 
55
   +------------+
 
56
   | BaseServer |
 
57
   +------------+
 
58
         |
 
59
         v
 
60
   +-----------+        +------------------+
 
61
   | TCPServer |------->| UnixStreamServer |
 
62
   +-----------+        +------------------+
 
63
         |
 
64
         v
 
65
   +-----------+        +--------------------+
 
66
   | UDPServer |------->| UnixDatagramServer |
 
67
   +-----------+        +--------------------+
 
68
 
 
69
Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from
 
70
:class:`UnixStreamServer` --- the only difference between an IP and a Unix
 
71
stream server is the address family, which is simply repeated in both Unix
 
72
server classes.
 
73
 
 
74
Forking and threading versions of each type of server can be created using the
 
75
:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes.  For instance,
 
76
a threading UDP server class is created as follows::
 
77
 
 
78
   class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
 
79
 
 
80
The mix-in class must come first, since it overrides a method defined in
 
81
:class:`UDPServer`.  Setting the various member variables also changes the
 
82
behavior of the underlying server mechanism.
 
83
 
 
84
To implement a service, you must derive a class from :class:`BaseRequestHandler`
 
85
and redefine its :meth:`handle` method.  You can then run various versions of
 
86
the service by combining one of the server classes with your request handler
 
87
class.  The request handler class must be different for datagram or stream
 
88
services.  This can be hidden by using the handler subclasses
 
89
:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
 
90
 
 
91
Of course, you still have to use your head!  For instance, it makes no sense to
 
92
use a forking server if the service contains state in memory that can be
 
93
modified by different requests, since the modifications in the child process
 
94
would never reach the initial state kept in the parent process and passed to
 
95
each child.  In this case, you can use a threading server, but you will probably
 
96
have to use locks to protect the integrity of the shared data.
 
97
 
 
98
On the other hand, if you are building an HTTP server where all data is stored
 
99
externally (for instance, in the file system), a synchronous class will
 
100
essentially render the service "deaf" while one request is being handled --
 
101
which may be for a very long time if a client is slow to receive all the data it
 
102
has requested.  Here a threading or forking server is appropriate.
 
103
 
 
104
In some cases, it may be appropriate to process part of a request synchronously,
 
105
but to finish processing in a forked child depending on the request data.  This
 
106
can be implemented by using a synchronous server and doing an explicit fork in
 
107
the request handler class :meth:`handle` method.
 
108
 
 
109
Another approach to handling multiple simultaneous requests in an environment
 
110
that supports neither threads nor :func:`fork` (or where these are too expensive
 
111
or inappropriate for the service) is to maintain an explicit table of partially
 
112
finished requests and to use :func:`select` to decide which request to work on
 
113
next (or whether to handle a new incoming request).  This is particularly
 
114
important for stream services where each client can potentially be connected for
 
115
a long time (if threads or subprocesses cannot be used). See :mod:`asyncore` for
 
116
another way to manage this.
 
117
 
 
118
.. XXX should data and methods be intermingled, or separate?
 
119
   how should the distinction between class and instance variables be drawn?
 
120
 
 
121
 
 
122
Server Objects
 
123
--------------
 
124
 
 
125
 
 
126
.. function:: fileno()
 
127
 
 
128
   Return an integer file descriptor for the socket on which the server is
 
129
   listening.  This function is most commonly passed to :func:`select.select`, to
 
130
   allow monitoring multiple servers in the same process.
 
131
 
 
132
 
 
133
.. function:: handle_request()
 
134
 
 
135
   Process a single request.  This function calls the following methods in
 
136
   order: :meth:`get_request`, :meth:`verify_request`, and
 
137
   :meth:`process_request`.  If the user-provided :meth:`handle` method of the
 
138
   handler class raises an exception, the server's :meth:`handle_error` method
 
139
   will be called.  If no request is received within :attr:`self.timeout`
 
140
   seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
 
141
   will return.
 
142
 
 
143
 
 
144
.. function:: serve_forever(poll_interval=0.5)
 
145
 
 
146
   Handle requests until an explicit :meth:`shutdown` request.  Polls for
 
147
   shutdown every *poll_interval* seconds.
 
148
 
 
149
 
 
150
.. function:: shutdown()
 
151
 
 
152
   Tells the :meth:`serve_forever` loop to stop and waits until it does.
 
153
 
 
154
 
 
155
.. data:: address_family
 
156
 
 
157
   The family of protocols to which the server's socket belongs.
 
158
   Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
 
159
 
 
160
 
 
161
.. data:: RequestHandlerClass
 
162
 
 
163
   The user-provided request handler class; an instance of this class is created
 
164
   for each request.
 
165
 
 
166
 
 
167
.. data:: server_address
 
168
 
 
169
   The address on which the server is listening.  The format of addresses varies
 
170
   depending on the protocol family; see the documentation for the socket module
 
171
   for details.  For Internet protocols, this is a tuple containing a string giving
 
172
   the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
 
173
 
 
174
 
 
175
.. data:: socket
 
176
 
 
177
   The socket object on which the server will listen for incoming requests.
 
178
 
 
179
The server classes support the following class variables:
 
180
 
 
181
.. XXX should class variables be covered before instance variables, or vice versa?
 
182
 
 
183
 
 
184
.. data:: allow_reuse_address
 
185
 
 
186
   Whether the server will allow the reuse of an address. This defaults to
 
187
   :const:`False`, and can be set in subclasses to change the policy.
 
188
 
 
189
 
 
190
.. data:: request_queue_size
 
191
 
 
192
   The size of the request queue.  If it takes a long time to process a single
 
193
   request, any requests that arrive while the server is busy are placed into a
 
194
   queue, up to :attr:`request_queue_size` requests.  Once the queue is full,
 
195
   further requests from clients will get a "Connection denied" error.  The default
 
196
   value is usually 5, but this can be overridden by subclasses.
 
197
 
 
198
 
 
199
.. data:: socket_type
 
200
 
 
201
   The type of socket used by the server; :const:`socket.SOCK_STREAM` and
 
202
   :const:`socket.SOCK_DGRAM` are two common values.
 
203
 
 
204
.. data:: timeout
 
205
 
 
206
   Timeout duration, measured in seconds, or :const:`None` if no timeout is
 
207
   desired.  If :meth:`handle_request` receives no incoming requests within the
 
208
   timeout period, the :meth:`handle_timeout` method is called.
 
209
 
 
210
There are various server methods that can be overridden by subclasses of base
 
211
server classes like :class:`TCPServer`; these methods aren't useful to external
 
212
users of the server object.
 
213
 
 
214
.. XXX should the default implementations of these be documented, or should
 
215
   it be assumed that the user will look at socketserver.py?
 
216
 
 
217
 
 
218
.. function:: finish_request()
 
219
 
 
220
   Actually processes the request by instantiating :attr:`RequestHandlerClass` and
 
221
   calling its :meth:`handle` method.
 
222
 
 
223
 
 
224
.. function:: get_request()
 
225
 
 
226
   Must accept a request from the socket, and return a 2-tuple containing the *new*
 
227
   socket object to be used to communicate with the client, and the client's
 
228
   address.
 
229
 
 
230
 
 
231
.. function:: handle_error(request, client_address)
 
232
 
 
233
   This function is called if the :attr:`RequestHandlerClass`'s :meth:`handle`
 
234
   method raises an exception.  The default action is to print the traceback to
 
235
   standard output and continue handling further requests.
 
236
 
 
237
.. function:: handle_timeout()
 
238
 
 
239
   This function is called when the :attr:`timeout` attribute has been set to a
 
240
   value other than :const:`None` and the timeout period has passed with no
 
241
   requests being received.  The default action for forking servers is
 
242
   to collect the status of any child processes that have exited, while
 
243
   in threading servers this method does nothing.
 
244
 
 
245
.. function:: process_request(request, client_address)
 
246
 
 
247
   Calls :meth:`finish_request` to create an instance of the
 
248
   :attr:`RequestHandlerClass`.  If desired, this function can create a new process
 
249
   or thread to handle the request; the :class:`ForkingMixIn` and
 
250
   :class:`ThreadingMixIn` classes do this.
 
251
 
 
252
.. Is there any point in documenting the following two functions?
 
253
   What would the purpose of overriding them be: initializing server
 
254
   instance variables, adding new network families?
 
255
 
 
256
 
 
257
.. function:: server_activate()
 
258
 
 
259
   Called by the server's constructor to activate the server.  The default behavior
 
260
   just :meth:`listen`\ s to the server's socket. May be overridden.
 
261
 
 
262
 
 
263
.. function:: server_bind()
 
264
 
 
265
   Called by the server's constructor to bind the socket to the desired address.
 
266
   May be overridden.
 
267
 
 
268
 
 
269
.. function:: verify_request(request, client_address)
 
270
 
 
271
   Must return a Boolean value; if the value is :const:`True`, the request will be
 
272
   processed, and if it's :const:`False`, the request will be denied. This function
 
273
   can be overridden to implement access controls for a server. The default
 
274
   implementation always returns :const:`True`.
 
275
 
 
276
 
 
277
RequestHandler Objects
 
278
----------------------
 
279
 
 
280
The request handler class must define a new :meth:`handle` method, and can
 
281
override any of the following methods.  A new instance is created for each
 
282
request.
 
283
 
 
284
 
 
285
.. function:: finish()
 
286
 
 
287
   Called after the :meth:`handle` method to perform any clean-up actions
 
288
   required.  The default implementation does nothing.  If :meth:`setup` or
 
289
   :meth:`handle` raise an exception, this function will not be called.
 
290
 
 
291
 
 
292
.. function:: handle()
 
293
 
 
294
   This function must do all the work required to service a request.  The
 
295
   default implementation does nothing.  Several instance attributes are
 
296
   available to it; the request is available as :attr:`self.request`; the client
 
297
   address as :attr:`self.client_address`; and the server instance as
 
298
   :attr:`self.server`, in case it needs access to per-server information.
 
299
 
 
300
   The type of :attr:`self.request` is different for datagram or stream
 
301
   services.  For stream services, :attr:`self.request` is a socket object; for
 
302
   datagram services, :attr:`self.request` is a pair of string and socket.
 
303
   However, this can be hidden by using the request handler subclasses
 
304
   :class:`StreamRequestHandler` or :class:`DatagramRequestHandler`, which
 
305
   override the :meth:`setup` and :meth:`finish` methods, and provide
 
306
   :attr:`self.rfile` and :attr:`self.wfile` attributes.  :attr:`self.rfile` and
 
307
   :attr:`self.wfile` can be read or written, respectively, to get the request
 
308
   data or return data to the client.
 
309
 
 
310
 
 
311
.. function:: setup()
 
312
 
 
313
   Called before the :meth:`handle` method to perform any initialization actions
 
314
   required.  The default implementation does nothing.
 
315
 
 
316
 
 
317
Examples
 
318
--------
 
319
 
 
320
:class:`socketserver.TCPServer` Example
 
321
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
322
 
 
323
This is the server side::
 
324
 
 
325
   import socketserver
 
326
 
 
327
   class MyTCPHandler(socketserver.BaseRequestHandler):
 
328
       """
 
329
       The RequestHandler class for our server.
 
330
 
 
331
       It is instantiated once per connection to the server, and must
 
332
       override the handle() method to implement communication to the
 
333
       client.
 
334
       """
 
335
 
 
336
       def handle(self):
 
337
           # self.request is the TCP socket connected to the client
 
338
           self.data = self.request.recv(1024).strip()
 
339
           print("%s wrote:" % self.client_address[0])
 
340
           print(self.data)
 
341
           # just send back the same data, but upper-cased
 
342
           self.request.send(self.data.upper())
 
343
 
 
344
   if __name__ == "__main__":
 
345
       HOST, PORT = "localhost", 9999
 
346
 
 
347
       # Create the server, binding to localhost on port 9999
 
348
       server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
 
349
 
 
350
       # Activate the server; this will keep running until you
 
351
       # interrupt the program with Ctrl-C
 
352
       server.serve_forever()
 
353
 
 
354
An alternative request handler class that makes use of streams (file-like
 
355
objects that simplify communication by providing the standard file interface)::
 
356
 
 
357
   class MyTCPHandler(socketserver.StreamRequestHandler):
 
358
 
 
359
       def handle(self):
 
360
           # self.rfile is a file-like object created by the handler;
 
361
           # we can now use e.g. readline() instead of raw recv() calls
 
362
           self.data = self.rfile.readline().strip()
 
363
           print("%s wrote:" % self.client_address[0])
 
364
           print(self.data)
 
365
           # Likewise, self.wfile is a file-like object used to write back
 
366
           # to the client
 
367
           self.wfile.write(self.data.upper())
 
368
 
 
369
The difference is that the ``readline()`` call in the second handler will call
 
370
``recv()`` multiple times until it encounters a newline character, while the
 
371
single ``recv()`` call in the first handler will just return what has been sent
 
372
from the client in one ``send()`` call.
 
373
 
 
374
 
 
375
This is the client side::
 
376
 
 
377
   import socket
 
378
   import sys
 
379
 
 
380
   HOST, PORT = "localhost", 9999
 
381
   data = " ".join(sys.argv[1:])
 
382
 
 
383
   # Create a socket (SOCK_STREAM means a TCP socket)
 
384
   sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
385
 
 
386
   # Connect to server and send data
 
387
   sock.connect((HOST, PORT))
 
388
   sock.send(bytes(data + "\n","utf8"))
 
389
 
 
390
   # Receive data from the server and shut down
 
391
   received = sock.recv(1024)
 
392
   sock.close()
 
393
 
 
394
   print("Sent:     %s" % data)
 
395
   print("Received: %s" % received)
 
396
 
 
397
 
 
398
The output of the example should look something like this:
 
399
 
 
400
Server::
 
401
 
 
402
   $ python TCPServer.py
 
403
   127.0.0.1 wrote:
 
404
   b'hello world with TCP'
 
405
   127.0.0.1 wrote:
 
406
   b'python is nice'
 
407
 
 
408
Client::
 
409
 
 
410
   $ python TCPClient.py hello world with TCP
 
411
   Sent:     hello world with TCP
 
412
   Received: b'HELLO WORLD WITH TCP'
 
413
   $ python TCPClient.py python is nice
 
414
   Sent:     python is nice
 
415
   Received: b'PYTHON IS NICE'
 
416
 
 
417
 
 
418
:class:`socketserver.UDPServer` Example
 
419
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
420
 
 
421
This is the server side::
 
422
 
 
423
   import socketserver
 
424
 
 
425
   class MyUDPHandler(socketserver.BaseRequestHandler):
 
426
       """
 
427
       This class works similar to the TCP handler class, except that
 
428
       self.request consists of a pair of data and client socket, and since
 
429
       there is no connection the client address must be given explicitly
 
430
       when sending data back via sendto().
 
431
       """
 
432
 
 
433
       def handle(self):
 
434
           data = self.request[0].strip()
 
435
           socket = self.request[1]
 
436
           print("%s wrote:" % self.client_address[0])
 
437
           print(data)
 
438
           socket.sendto(data.upper(), self.client_address)
 
439
 
 
440
   if __name__ == "__main__":
 
441
      HOST, PORT = "localhost", 9999
 
442
      server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
 
443
      server.serve_forever()
 
444
 
 
445
This is the client side::
 
446
 
 
447
   import socket
 
448
   import sys
 
449
 
 
450
   HOST, PORT = "localhost", 9999
 
451
   data = " ".join(sys.argv[1:])
 
452
 
 
453
   # SOCK_DGRAM is the socket type to use for UDP sockets
 
454
   sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
455
 
 
456
   # As you can see, there is no connect() call; UDP has no connections.
 
457
   # Instead, data is directly sent to the recipient via sendto().
 
458
   sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT))
 
459
   received = sock.recv(1024)
 
460
 
 
461
   print("Sent:     %s" % data)
 
462
   print("Received: %s" % received)
 
463
 
 
464
The output of the example should look exactly like for the TCP server example.
 
465
 
 
466
 
 
467
Asynchronous Mixins
 
468
~~~~~~~~~~~~~~~~~~~
 
469
 
 
470
To build asynchronous handlers, use the :class:`ThreadingMixIn` and
 
471
:class:`ForkingMixIn` classes.
 
472
 
 
473
An example for the :class:`ThreadingMixIn` class::
 
474
 
 
475
   import socket
 
476
   import threading
 
477
   import socketserver
 
478
 
 
479
   class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
 
480
 
 
481
       def handle(self):
 
482
           data = self.request.recv(1024)
 
483
           cur_thread = threading.current_thread()
 
484
           response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii')
 
485
           self.request.send(response)
 
486
 
 
487
   class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
 
488
       pass
 
489
 
 
490
   def client(ip, port, message):
 
491
       sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
492
       sock.connect((ip, port))
 
493
       sock.send(message)
 
494
       response = sock.recv(1024)
 
495
       print("Received: %s" % response)
 
496
       sock.close()
 
497
 
 
498
   if __name__ == "__main__":
 
499
       # Port 0 means to select an arbitrary unused port
 
500
       HOST, PORT = "localhost", 0
 
501
 
 
502
       server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
 
503
       ip, port = server.server_address
 
504
 
 
505
       # Start a thread with the server -- that thread will then start one
 
506
       # more thread for each request
 
507
       server_thread = threading.Thread(target=server.serve_forever)
 
508
       # Exit the server thread when the main thread terminates
 
509
       server_thread.setDaemon(True)
 
510
       server_thread.start()
 
511
       print("Server loop running in thread:", server_thread.name)
 
512
 
 
513
       client(ip, port, b"Hello World 1")
 
514
       client(ip, port, b"Hello World 2")
 
515
       client(ip, port, b"Hello World 3")
 
516
 
 
517
       server.shutdown()
 
518
 
 
519
 
 
520
The output of the example should look something like this::
 
521
 
 
522
   $ python ThreadedTCPServer.py
 
523
   Server loop running in thread: Thread-1
 
524
   Received: b"Thread-2: b'Hello World 1'"
 
525
   Received: b"Thread-3: b'Hello World 2'"
 
526
   Received: b"Thread-4: b'Hello World 3'"
 
527
 
 
528
 
 
529
The :class:`ForkingMixIn` class is used in the same way, except that the server
 
530
will spawn a new process for each request.