blob: b63571dfb97118d955a1106dc11c1d078d578565 [file] [log] [blame]
Alexandre Vassalottice261952008-05-12 02:31:37 +00001:mod:`socketserver` --- A framework for network servers
Georg Brandl116aa622007-08-15 14:28:22 +00002=======================================================
3
Alexandre Vassalottice261952008-05-12 02:31:37 +00004.. module:: socketserver
Georg Brandl116aa622007-08-15 14:28:22 +00005 :synopsis: A framework for network servers.
6
Raymond Hettinger469271d2011-01-27 20:38:46 +00007**Source code:** :source:`Lib/socketserver.py`
8
9--------------
10
Alexandre Vassalottice261952008-05-12 02:31:37 +000011The :mod:`socketserver` module simplifies the task of writing network servers.
Georg Brandl116aa622007-08-15 14:28:22 +000012
13There are four basic server classes: :class:`TCPServer` uses the Internet TCP
14protocol, which provides for continuous streams of data between the client and
15server. :class:`UDPServer` uses datagrams, which are discrete packets of
16information that may arrive out of order or be lost while in transit. The more
17infrequently used :class:`UnixStreamServer` and :class:`UnixDatagramServer`
18classes are similar, but use Unix domain sockets; they're not available on
19non-Unix platforms. For more details on network programming, consult a book
20such as
21W. Richard Steven's UNIX Network Programming or Ralph Davis's Win32 Network
22Programming.
23
24These four classes process requests :dfn:`synchronously`; each request must be
25completed before the next request can be started. This isn't suitable if each
26request takes a long time to complete, because it requires a lot of computation,
27or because it returns a lot of data which the client is slow to process. The
28solution is to create a separate process or thread to handle each request; the
29:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes can be used to
30support asynchronous behaviour.
31
32Creating a server requires several steps. First, you must create a request
33handler class by subclassing the :class:`BaseRequestHandler` class and
34overriding its :meth:`handle` method; this method will process incoming
35requests. Second, you must instantiate one of the server classes, passing it
36the server's address and the request handler class. Finally, call the
37:meth:`handle_request` or :meth:`serve_forever` method of the server object to
38process one or many requests.
39
40When inheriting from :class:`ThreadingMixIn` for threaded connection behavior,
41you should explicitly declare how you want your threads to behave on an abrupt
42shutdown. The :class:`ThreadingMixIn` class defines an attribute
43*daemon_threads*, which indicates whether or not the server should wait for
44thread termination. You should set the flag explicitly if you would like threads
45to behave autonomously; the default is :const:`False`, meaning that Python will
46not exit until all threads created by :class:`ThreadingMixIn` have exited.
47
48Server classes have the same external methods and attributes, no matter what
Georg Brandlfceab5a2008-01-19 20:08:23 +000049network protocol they use.
Georg Brandl116aa622007-08-15 14:28:22 +000050
51
52Server Creation Notes
53---------------------
54
55There are five classes in an inheritance diagram, four of which represent
56synchronous servers of four types::
57
58 +------------+
59 | BaseServer |
60 +------------+
61 |
62 v
63 +-----------+ +------------------+
64 | TCPServer |------->| UnixStreamServer |
65 +-----------+ +------------------+
66 |
67 v
68 +-----------+ +--------------------+
69 | UDPServer |------->| UnixDatagramServer |
70 +-----------+ +--------------------+
71
72Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from
73:class:`UnixStreamServer` --- the only difference between an IP and a Unix
74stream server is the address family, which is simply repeated in both Unix
75server classes.
76
77Forking and threading versions of each type of server can be created using the
78:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes. For instance,
79a threading UDP server class is created as follows::
80
81 class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
82
83The mix-in class must come first, since it overrides a method defined in
Senthil Kumarana6bac952011-07-04 11:28:30 -070084:class:`UDPServer`. Setting the various attributes also change the
Georg Brandl116aa622007-08-15 14:28:22 +000085behavior of the underlying server mechanism.
86
87To implement a service, you must derive a class from :class:`BaseRequestHandler`
88and redefine its :meth:`handle` method. You can then run various versions of
89the service by combining one of the server classes with your request handler
90class. The request handler class must be different for datagram or stream
91services. This can be hidden by using the handler subclasses
92:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
93
94Of course, you still have to use your head! For instance, it makes no sense to
95use a forking server if the service contains state in memory that can be
96modified by different requests, since the modifications in the child process
97would never reach the initial state kept in the parent process and passed to
98each child. In this case, you can use a threading server, but you will probably
99have to use locks to protect the integrity of the shared data.
100
101On the other hand, if you are building an HTTP server where all data is stored
102externally (for instance, in the file system), a synchronous class will
103essentially render the service "deaf" while one request is being handled --
104which may be for a very long time if a client is slow to receive all the data it
105has requested. Here a threading or forking server is appropriate.
106
107In some cases, it may be appropriate to process part of a request synchronously,
108but to finish processing in a forked child depending on the request data. This
109can be implemented by using a synchronous server and doing an explicit fork in
110the request handler class :meth:`handle` method.
111
112Another approach to handling multiple simultaneous requests in an environment
113that supports neither threads nor :func:`fork` (or where these are too expensive
114or inappropriate for the service) is to maintain an explicit table of partially
115finished requests and to use :func:`select` to decide which request to work on
116next (or whether to handle a new incoming request). This is particularly
117important for stream services where each client can potentially be connected for
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000118a long time (if threads or subprocesses cannot be used). See :mod:`asyncore` for
119another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000120
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000121.. XXX should data and methods be intermingled, or separate?
122 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000123
124
125Server Objects
126--------------
127
Benjamin Petersond23f8222009-04-05 19:13:16 +0000128.. class:: BaseServer
Georg Brandl116aa622007-08-15 14:28:22 +0000129
Benjamin Petersond23f8222009-04-05 19:13:16 +0000130 This is the superclass of all Server objects in the module. It defines the
131 interface, given below, but does not implement most of the methods, which is
132 done in subclasses.
133
134
135.. method:: BaseServer.fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000136
137 Return an integer file descriptor for the socket on which the server is
138 listening. This function is most commonly passed to :func:`select.select`, to
139 allow monitoring multiple servers in the same process.
140
141
Benjamin Petersond23f8222009-04-05 19:13:16 +0000142.. method:: BaseServer.handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000143
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000144 Process a single request. This function calls the following methods in
145 order: :meth:`get_request`, :meth:`verify_request`, and
146 :meth:`process_request`. If the user-provided :meth:`handle` method of the
147 handler class raises an exception, the server's :meth:`handle_error` method
148 will be called. If no request is received within :attr:`self.timeout`
149 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
150 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000151
152
Benjamin Petersond23f8222009-04-05 19:13:16 +0000153.. method:: BaseServer.serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000154
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000155 Handle requests until an explicit :meth:`shutdown` request. Polls for
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800156 shutdown every *poll_interval* seconds. It also calls
157 :meth:`service_actions` which may be used by a subclass or Mixin to provide
158 various cleanup actions. For e.g. ForkingMixin class uses
159 :meth:`service_actions` to cleanup the zombie child processes.
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000160
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800161 .. versionchanged:: 3.3
162 Added service_actions call to the serve_forever method.
163
164
165.. method:: BaseServer.service_actions()
166
167 This is called by the serve_forever loop. This method is can be overridden
168 by Mixin's to add cleanup or service specific actions.
169
170 .. versionadded:: 3.3
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000171
Benjamin Petersond23f8222009-04-05 19:13:16 +0000172.. method:: BaseServer.shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000173
174 Tells the :meth:`serve_forever` loop to stop and waits until it does.
Georg Brandl116aa622007-08-15 14:28:22 +0000175
176
Benjamin Petersond23f8222009-04-05 19:13:16 +0000177.. attribute:: BaseServer.address_family
Georg Brandl116aa622007-08-15 14:28:22 +0000178
179 The family of protocols to which the server's socket belongs.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000180 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Georg Brandl116aa622007-08-15 14:28:22 +0000181
182
Benjamin Petersond23f8222009-04-05 19:13:16 +0000183.. attribute:: BaseServer.RequestHandlerClass
Georg Brandl116aa622007-08-15 14:28:22 +0000184
185 The user-provided request handler class; an instance of this class is created
186 for each request.
187
188
Benjamin Petersond23f8222009-04-05 19:13:16 +0000189.. attribute:: BaseServer.server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000190
191 The address on which the server is listening. The format of addresses varies
192 depending on the protocol family; see the documentation for the socket module
193 for details. For Internet protocols, this is a tuple containing a string giving
194 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
195
196
Benjamin Petersond23f8222009-04-05 19:13:16 +0000197.. attribute:: BaseServer.socket
Georg Brandl116aa622007-08-15 14:28:22 +0000198
199 The socket object on which the server will listen for incoming requests.
200
Benjamin Petersond23f8222009-04-05 19:13:16 +0000201
Georg Brandl116aa622007-08-15 14:28:22 +0000202The server classes support the following class variables:
203
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000204.. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000205
Benjamin Petersond23f8222009-04-05 19:13:16 +0000206.. attribute:: BaseServer.allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000207
208 Whether the server will allow the reuse of an address. This defaults to
209 :const:`False`, and can be set in subclasses to change the policy.
210
211
Benjamin Petersond23f8222009-04-05 19:13:16 +0000212.. attribute:: BaseServer.request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000213
214 The size of the request queue. If it takes a long time to process a single
215 request, any requests that arrive while the server is busy are placed into a
216 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
217 further requests from clients will get a "Connection denied" error. The default
218 value is usually 5, but this can be overridden by subclasses.
219
220
Benjamin Petersond23f8222009-04-05 19:13:16 +0000221.. attribute:: BaseServer.socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000222
223 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000224 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000225
Benjamin Petersond23f8222009-04-05 19:13:16 +0000226
227.. attribute:: BaseServer.timeout
Georg Brandlfceab5a2008-01-19 20:08:23 +0000228
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000229 Timeout duration, measured in seconds, or :const:`None` if no timeout is
230 desired. If :meth:`handle_request` receives no incoming requests within the
231 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000232
Benjamin Petersond23f8222009-04-05 19:13:16 +0000233
Georg Brandl116aa622007-08-15 14:28:22 +0000234There are various server methods that can be overridden by subclasses of base
235server classes like :class:`TCPServer`; these methods aren't useful to external
236users of the server object.
237
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000238.. XXX should the default implementations of these be documented, or should
Alexandre Vassalottice261952008-05-12 02:31:37 +0000239 it be assumed that the user will look at socketserver.py?
Georg Brandl116aa622007-08-15 14:28:22 +0000240
Benjamin Petersond23f8222009-04-05 19:13:16 +0000241.. method:: BaseServer.finish_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000242
243 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
244 calling its :meth:`handle` method.
245
246
Benjamin Petersond23f8222009-04-05 19:13:16 +0000247.. method:: BaseServer.get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000248
249 Must accept a request from the socket, and return a 2-tuple containing the *new*
250 socket object to be used to communicate with the client, and the client's
251 address.
252
253
Benjamin Petersond23f8222009-04-05 19:13:16 +0000254.. method:: BaseServer.handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000255
256 This function is called if the :attr:`RequestHandlerClass`'s :meth:`handle`
257 method raises an exception. The default action is to print the traceback to
258 standard output and continue handling further requests.
259
Benjamin Petersond23f8222009-04-05 19:13:16 +0000260
261.. method:: BaseServer.handle_timeout()
Georg Brandlfceab5a2008-01-19 20:08:23 +0000262
Georg Brandlb533e262008-05-25 18:19:30 +0000263 This function is called when the :attr:`timeout` attribute has been set to a
264 value other than :const:`None` and the timeout period has passed with no
Georg Brandlfceab5a2008-01-19 20:08:23 +0000265 requests being received. The default action for forking servers is
266 to collect the status of any child processes that have exited, while
267 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000268
Benjamin Petersond23f8222009-04-05 19:13:16 +0000269
270.. method:: BaseServer.process_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000271
272 Calls :meth:`finish_request` to create an instance of the
273 :attr:`RequestHandlerClass`. If desired, this function can create a new process
274 or thread to handle the request; the :class:`ForkingMixIn` and
275 :class:`ThreadingMixIn` classes do this.
276
Benjamin Petersond23f8222009-04-05 19:13:16 +0000277
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000278.. Is there any point in documenting the following two functions?
279 What would the purpose of overriding them be: initializing server
280 instance variables, adding new network families?
Georg Brandl116aa622007-08-15 14:28:22 +0000281
Benjamin Petersond23f8222009-04-05 19:13:16 +0000282.. method:: BaseServer.server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000283
284 Called by the server's constructor to activate the server. The default behavior
285 just :meth:`listen`\ s to the server's socket. May be overridden.
286
287
Benjamin Petersond23f8222009-04-05 19:13:16 +0000288.. method:: BaseServer.server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000289
290 Called by the server's constructor to bind the socket to the desired address.
291 May be overridden.
292
293
Benjamin Petersond23f8222009-04-05 19:13:16 +0000294.. method:: BaseServer.verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000295
296 Must return a Boolean value; if the value is :const:`True`, the request will be
297 processed, and if it's :const:`False`, the request will be denied. This function
298 can be overridden to implement access controls for a server. The default
299 implementation always returns :const:`True`.
300
301
302RequestHandler Objects
303----------------------
304
305The request handler class must define a new :meth:`handle` method, and can
306override any of the following methods. A new instance is created for each
307request.
308
309
Benjamin Petersond23f8222009-04-05 19:13:16 +0000310.. method:: RequestHandler.finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000311
Georg Brandlb533e262008-05-25 18:19:30 +0000312 Called after the :meth:`handle` method to perform any clean-up actions
313 required. The default implementation does nothing. If :meth:`setup` or
314 :meth:`handle` raise an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000315
316
Benjamin Petersond23f8222009-04-05 19:13:16 +0000317.. method:: RequestHandler.handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000318
Georg Brandlb533e262008-05-25 18:19:30 +0000319 This function must do all the work required to service a request. The
320 default implementation does nothing. Several instance attributes are
321 available to it; the request is available as :attr:`self.request`; the client
322 address as :attr:`self.client_address`; and the server instance as
323 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000324
Georg Brandlb533e262008-05-25 18:19:30 +0000325 The type of :attr:`self.request` is different for datagram or stream
326 services. For stream services, :attr:`self.request` is a socket object; for
327 datagram services, :attr:`self.request` is a pair of string and socket.
328 However, this can be hidden by using the request handler subclasses
329 :class:`StreamRequestHandler` or :class:`DatagramRequestHandler`, which
330 override the :meth:`setup` and :meth:`finish` methods, and provide
331 :attr:`self.rfile` and :attr:`self.wfile` attributes. :attr:`self.rfile` and
332 :attr:`self.wfile` can be read or written, respectively, to get the request
333 data or return data to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000334
335
Benjamin Petersond23f8222009-04-05 19:13:16 +0000336.. method:: RequestHandler.setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000337
338 Called before the :meth:`handle` method to perform any initialization actions
339 required. The default implementation does nothing.
340
Georg Brandlb533e262008-05-25 18:19:30 +0000341
342Examples
343--------
344
345:class:`socketserver.TCPServer` Example
346~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
347
348This is the server side::
349
350 import socketserver
351
352 class MyTCPHandler(socketserver.BaseRequestHandler):
353 """
354 The RequestHandler class for our server.
355
356 It is instantiated once per connection to the server, and must
357 override the handle() method to implement communication to the
358 client.
359 """
360
361 def handle(self):
362 # self.request is the TCP socket connected to the client
363 self.data = self.request.recv(1024).strip()
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000364 print("%s wrote:" % self.client_address[0])
365 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000366 # just send back the same data, but upper-cased
367 self.request.send(self.data.upper())
368
369 if __name__ == "__main__":
370 HOST, PORT = "localhost", 9999
371
372 # Create the server, binding to localhost on port 9999
373 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
374
375 # Activate the server; this will keep running until you
376 # interrupt the program with Ctrl-C
377 server.serve_forever()
378
379An alternative request handler class that makes use of streams (file-like
380objects that simplify communication by providing the standard file interface)::
381
382 class MyTCPHandler(socketserver.StreamRequestHandler):
383
384 def handle(self):
385 # self.rfile is a file-like object created by the handler;
386 # we can now use e.g. readline() instead of raw recv() calls
387 self.data = self.rfile.readline().strip()
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000388 print("%s wrote:" % self.client_address[0])
389 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000390 # Likewise, self.wfile is a file-like object used to write back
391 # to the client
392 self.wfile.write(self.data.upper())
393
394The difference is that the ``readline()`` call in the second handler will call
395``recv()`` multiple times until it encounters a newline character, while the
396single ``recv()`` call in the first handler will just return what has been sent
397from the client in one ``send()`` call.
398
399
400This is the client side::
401
402 import socket
403 import sys
404
405 HOST, PORT = "localhost", 9999
406 data = " ".join(sys.argv[1:])
407
408 # Create a socket (SOCK_STREAM means a TCP socket)
409 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
410
411 # Connect to server and send data
412 sock.connect((HOST, PORT))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000413 sock.send(bytes(data + "\n","utf8"))
Georg Brandlb533e262008-05-25 18:19:30 +0000414
415 # Receive data from the server and shut down
416 received = sock.recv(1024)
417 sock.close()
418
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000419 print("Sent: %s" % data)
420 print("Received: %s" % received)
Georg Brandlb533e262008-05-25 18:19:30 +0000421
422
423The output of the example should look something like this:
424
425Server::
426
427 $ python TCPServer.py
428 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000429 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000430 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000431 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000432
433Client::
434
435 $ python TCPClient.py hello world with TCP
436 Sent: hello world with TCP
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000437 Received: b'HELLO WORLD WITH TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000438 $ python TCPClient.py python is nice
439 Sent: python is nice
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000440 Received: b'PYTHON IS NICE'
Georg Brandlb533e262008-05-25 18:19:30 +0000441
442
443:class:`socketserver.UDPServer` Example
444~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
445
446This is the server side::
447
448 import socketserver
449
450 class MyUDPHandler(socketserver.BaseRequestHandler):
451 """
452 This class works similar to the TCP handler class, except that
453 self.request consists of a pair of data and client socket, and since
454 there is no connection the client address must be given explicitly
455 when sending data back via sendto().
456 """
457
458 def handle(self):
459 data = self.request[0].strip()
460 socket = self.request[1]
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000461 print("%s wrote:" % self.client_address[0])
462 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000463 socket.sendto(data.upper(), self.client_address)
464
465 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000466 HOST, PORT = "localhost", 9999
467 server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
468 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000469
470This is the client side::
471
472 import socket
473 import sys
474
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000475 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000476 data = " ".join(sys.argv[1:])
477
478 # SOCK_DGRAM is the socket type to use for UDP sockets
479 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
480
481 # As you can see, there is no connect() call; UDP has no connections.
482 # Instead, data is directly sent to the recipient via sendto().
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000483 sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT))
Georg Brandlb533e262008-05-25 18:19:30 +0000484 received = sock.recv(1024)
485
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000486 print("Sent: %s" % data)
487 print("Received: %s" % received)
Georg Brandlb533e262008-05-25 18:19:30 +0000488
489The output of the example should look exactly like for the TCP server example.
490
491
492Asynchronous Mixins
493~~~~~~~~~~~~~~~~~~~
494
495To build asynchronous handlers, use the :class:`ThreadingMixIn` and
496:class:`ForkingMixIn` classes.
497
498An example for the :class:`ThreadingMixIn` class::
499
500 import socket
501 import threading
502 import socketserver
503
504 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
505
506 def handle(self):
507 data = self.request.recv(1024)
Georg Brandlf9926402008-06-13 06:32:25 +0000508 cur_thread = threading.current_thread()
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000509 response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii')
Georg Brandlb533e262008-05-25 18:19:30 +0000510 self.request.send(response)
511
512 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
513 pass
514
515 def client(ip, port, message):
516 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
517 sock.connect((ip, port))
518 sock.send(message)
519 response = sock.recv(1024)
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000520 print("Received: %s" % response)
Georg Brandlb533e262008-05-25 18:19:30 +0000521 sock.close()
522
523 if __name__ == "__main__":
524 # Port 0 means to select an arbitrary unused port
525 HOST, PORT = "localhost", 0
526
527 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
528 ip, port = server.server_address
529
530 # Start a thread with the server -- that thread will then start one
531 # more thread for each request
532 server_thread = threading.Thread(target=server.serve_forever)
533 # Exit the server thread when the main thread terminates
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000534 server_thread.setDaemon(True)
Georg Brandlb533e262008-05-25 18:19:30 +0000535 server_thread.start()
Benjamin Petersond75fcb42009-02-19 04:22:03 +0000536 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000537
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000538 client(ip, port, b"Hello World 1")
539 client(ip, port, b"Hello World 2")
540 client(ip, port, b"Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000541
542 server.shutdown()
543
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000544
Georg Brandlb533e262008-05-25 18:19:30 +0000545The output of the example should look something like this::
546
547 $ python ThreadedTCPServer.py
548 Server loop running in thread: Thread-1
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000549 Received: b"Thread-2: b'Hello World 1'"
550 Received: b"Thread-3: b'Hello World 2'"
551 Received: b"Thread-4: b'Hello World 3'"
Georg Brandlb533e262008-05-25 18:19:30 +0000552
553
554The :class:`ForkingMixIn` class is used in the same way, except that the server
555will spawn a new process for each request.