blob: 7dc0cc73d674816832863474aa97c97bfc30e1b8 [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
Florent Xicluna599d76b2011-11-11 19:56:26 +010042shutdown. The :class:`ThreadingMixIn` class defines an attribute
Georg Brandl116aa622007-08-15 14:28:22 +000043*daemon_threads*, which indicates whether or not the server should wait for
Florent Xicluna599d76b2011-11-11 19:56:26 +010044thread termination. You should set the flag explicitly if you would like
45threads to behave autonomously; the default is :const:`False`, meaning that
46Python will not exit until all threads created by :class:`ThreadingMixIn` have
47exited.
Georg Brandl116aa622007-08-15 14:28:22 +000048
49Server classes have the same external methods and attributes, no matter what
Georg Brandlfceab5a2008-01-19 20:08:23 +000050network protocol they use.
Georg Brandl116aa622007-08-15 14:28:22 +000051
52
53Server Creation Notes
54---------------------
55
56There are five classes in an inheritance diagram, four of which represent
57synchronous servers of four types::
58
59 +------------+
60 | BaseServer |
61 +------------+
62 |
63 v
64 +-----------+ +------------------+
65 | TCPServer |------->| UnixStreamServer |
66 +-----------+ +------------------+
67 |
68 v
69 +-----------+ +--------------------+
70 | UDPServer |------->| UnixDatagramServer |
71 +-----------+ +--------------------+
72
73Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from
74:class:`UnixStreamServer` --- the only difference between an IP and a Unix
75stream server is the address family, which is simply repeated in both Unix
76server classes.
77
78Forking and threading versions of each type of server can be created using the
79:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes. For instance,
80a threading UDP server class is created as follows::
81
82 class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
83
84The mix-in class must come first, since it overrides a method defined in
Senthil Kumarana6bac952011-07-04 11:28:30 -070085:class:`UDPServer`. Setting the various attributes also change the
Georg Brandl116aa622007-08-15 14:28:22 +000086behavior of the underlying server mechanism.
87
88To implement a service, you must derive a class from :class:`BaseRequestHandler`
89and redefine its :meth:`handle` method. You can then run various versions of
90the service by combining one of the server classes with your request handler
91class. The request handler class must be different for datagram or stream
92services. This can be hidden by using the handler subclasses
93:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
94
95Of course, you still have to use your head! For instance, it makes no sense to
96use a forking server if the service contains state in memory that can be
97modified by different requests, since the modifications in the child process
98would never reach the initial state kept in the parent process and passed to
99each child. In this case, you can use a threading server, but you will probably
100have to use locks to protect the integrity of the shared data.
101
102On the other hand, if you are building an HTTP server where all data is stored
103externally (for instance, in the file system), a synchronous class will
104essentially render the service "deaf" while one request is being handled --
105which may be for a very long time if a client is slow to receive all the data it
106has requested. Here a threading or forking server is appropriate.
107
108In some cases, it may be appropriate to process part of a request synchronously,
109but to finish processing in a forked child depending on the request data. This
110can be implemented by using a synchronous server and doing an explicit fork in
111the request handler class :meth:`handle` method.
112
113Another approach to handling multiple simultaneous requests in an environment
114that supports neither threads nor :func:`fork` (or where these are too expensive
115or inappropriate for the service) is to maintain an explicit table of partially
116finished requests and to use :func:`select` to decide which request to work on
117next (or whether to handle a new incoming request). This is particularly
118important for stream services where each client can potentially be connected for
Florent Xicluna599d76b2011-11-11 19:56:26 +0100119a long time (if threads or subprocesses cannot be used). See :mod:`asyncore`
120for another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000121
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000122.. XXX should data and methods be intermingled, or separate?
123 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000124
125
126Server Objects
127--------------
128
Benjamin Petersond23f8222009-04-05 19:13:16 +0000129.. class:: BaseServer
Georg Brandl116aa622007-08-15 14:28:22 +0000130
Benjamin Petersond23f8222009-04-05 19:13:16 +0000131 This is the superclass of all Server objects in the module. It defines the
132 interface, given below, but does not implement most of the methods, which is
133 done in subclasses.
134
135
136.. method:: BaseServer.fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000137
138 Return an integer file descriptor for the socket on which the server is
139 listening. This function is most commonly passed to :func:`select.select`, to
140 allow monitoring multiple servers in the same process.
141
142
Benjamin Petersond23f8222009-04-05 19:13:16 +0000143.. method:: BaseServer.handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000144
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000145 Process a single request. This function calls the following methods in
146 order: :meth:`get_request`, :meth:`verify_request`, and
147 :meth:`process_request`. If the user-provided :meth:`handle` method of the
148 handler class raises an exception, the server's :meth:`handle_error` method
149 will be called. If no request is received within :attr:`self.timeout`
150 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
151 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000152
153
Benjamin Petersond23f8222009-04-05 19:13:16 +0000154.. method:: BaseServer.serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000155
Sandro Tosi753b79c2012-01-03 22:35:54 +0100156 Handle requests until an explicit :meth:`shutdown` request.
Sandro Tosi9b5626d2012-01-03 22:47:28 +0100157 Poll for shutdown every *poll_interval* seconds. Ignores :attr:`self.timeout`. It also calls
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800158 :meth:`service_actions` which may be used by a subclass or Mixin to provide
Florent Xiclunaf8240d62011-11-11 19:58:53 +0100159 various cleanup actions. For e.g. ForkingMixin class uses
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800160 :meth:`service_actions` to cleanup the zombie child processes.
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000161
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800162 .. versionchanged:: 3.3
163 Added service_actions call to the serve_forever method.
164
165
166.. method:: BaseServer.service_actions()
167
168 This is called by the serve_forever loop. This method is can be overridden
169 by Mixin's to add cleanup or service specific actions.
170
171 .. versionadded:: 3.3
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000172
Benjamin Petersond23f8222009-04-05 19:13:16 +0000173.. method:: BaseServer.shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000174
Sandro Tosi753b79c2012-01-03 22:35:54 +0100175 Tell the :meth:`serve_forever` loop to stop and wait until it does.
Georg Brandl116aa622007-08-15 14:28:22 +0000176
177
Benjamin Petersond23f8222009-04-05 19:13:16 +0000178.. attribute:: BaseServer.address_family
Georg Brandl116aa622007-08-15 14:28:22 +0000179
180 The family of protocols to which the server's socket belongs.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000181 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Georg Brandl116aa622007-08-15 14:28:22 +0000182
183
Benjamin Petersond23f8222009-04-05 19:13:16 +0000184.. attribute:: BaseServer.RequestHandlerClass
Georg Brandl116aa622007-08-15 14:28:22 +0000185
186 The user-provided request handler class; an instance of this class is created
187 for each request.
188
189
Benjamin Petersond23f8222009-04-05 19:13:16 +0000190.. attribute:: BaseServer.server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000191
192 The address on which the server is listening. The format of addresses varies
193 depending on the protocol family; see the documentation for the socket module
194 for details. For Internet protocols, this is a tuple containing a string giving
195 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
196
197
Benjamin Petersond23f8222009-04-05 19:13:16 +0000198.. attribute:: BaseServer.socket
Georg Brandl116aa622007-08-15 14:28:22 +0000199
200 The socket object on which the server will listen for incoming requests.
201
Benjamin Petersond23f8222009-04-05 19:13:16 +0000202
Georg Brandl116aa622007-08-15 14:28:22 +0000203The server classes support the following class variables:
204
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000205.. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000206
Benjamin Petersond23f8222009-04-05 19:13:16 +0000207.. attribute:: BaseServer.allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000208
Florent Xicluna599d76b2011-11-11 19:56:26 +0100209 Whether the server will allow the reuse of an address. This defaults to
Georg Brandl116aa622007-08-15 14:28:22 +0000210 :const:`False`, and can be set in subclasses to change the policy.
211
212
Benjamin Petersond23f8222009-04-05 19:13:16 +0000213.. attribute:: BaseServer.request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000214
215 The size of the request queue. If it takes a long time to process a single
216 request, any requests that arrive while the server is busy are placed into a
217 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
218 further requests from clients will get a "Connection denied" error. The default
219 value is usually 5, but this can be overridden by subclasses.
220
221
Benjamin Petersond23f8222009-04-05 19:13:16 +0000222.. attribute:: BaseServer.socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000223
224 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000225 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000226
Benjamin Petersond23f8222009-04-05 19:13:16 +0000227
228.. attribute:: BaseServer.timeout
Georg Brandlfceab5a2008-01-19 20:08:23 +0000229
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000230 Timeout duration, measured in seconds, or :const:`None` if no timeout is
231 desired. If :meth:`handle_request` receives no incoming requests within the
232 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000233
Benjamin Petersond23f8222009-04-05 19:13:16 +0000234
Georg Brandl116aa622007-08-15 14:28:22 +0000235There are various server methods that can be overridden by subclasses of base
236server classes like :class:`TCPServer`; these methods aren't useful to external
237users of the server object.
238
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000239.. XXX should the default implementations of these be documented, or should
Alexandre Vassalottice261952008-05-12 02:31:37 +0000240 it be assumed that the user will look at socketserver.py?
Georg Brandl116aa622007-08-15 14:28:22 +0000241
Benjamin Petersond23f8222009-04-05 19:13:16 +0000242.. method:: BaseServer.finish_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000243
244 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
245 calling its :meth:`handle` method.
246
247
Benjamin Petersond23f8222009-04-05 19:13:16 +0000248.. method:: BaseServer.get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000249
250 Must accept a request from the socket, and return a 2-tuple containing the *new*
251 socket object to be used to communicate with the client, and the client's
252 address.
253
254
Benjamin Petersond23f8222009-04-05 19:13:16 +0000255.. method:: BaseServer.handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000256
257 This function is called if the :attr:`RequestHandlerClass`'s :meth:`handle`
258 method raises an exception. The default action is to print the traceback to
259 standard output and continue handling further requests.
260
Benjamin Petersond23f8222009-04-05 19:13:16 +0000261
262.. method:: BaseServer.handle_timeout()
Georg Brandlfceab5a2008-01-19 20:08:23 +0000263
Georg Brandlb533e262008-05-25 18:19:30 +0000264 This function is called when the :attr:`timeout` attribute has been set to a
265 value other than :const:`None` and the timeout period has passed with no
Georg Brandlfceab5a2008-01-19 20:08:23 +0000266 requests being received. The default action for forking servers is
267 to collect the status of any child processes that have exited, while
268 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000269
Benjamin Petersond23f8222009-04-05 19:13:16 +0000270
271.. method:: BaseServer.process_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000272
273 Calls :meth:`finish_request` to create an instance of the
274 :attr:`RequestHandlerClass`. If desired, this function can create a new process
275 or thread to handle the request; the :class:`ForkingMixIn` and
276 :class:`ThreadingMixIn` classes do this.
277
Benjamin Petersond23f8222009-04-05 19:13:16 +0000278
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000279.. Is there any point in documenting the following two functions?
280 What would the purpose of overriding them be: initializing server
281 instance variables, adding new network families?
Georg Brandl116aa622007-08-15 14:28:22 +0000282
Benjamin Petersond23f8222009-04-05 19:13:16 +0000283.. method:: BaseServer.server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000284
285 Called by the server's constructor to activate the server. The default behavior
Florent Xicluna599d76b2011-11-11 19:56:26 +0100286 just :meth:`listen`\ s to the server's socket. May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000287
288
Benjamin Petersond23f8222009-04-05 19:13:16 +0000289.. method:: BaseServer.server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000290
291 Called by the server's constructor to bind the socket to the desired address.
292 May be overridden.
293
294
Benjamin Petersond23f8222009-04-05 19:13:16 +0000295.. method:: BaseServer.verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000296
Florent Xicluna599d76b2011-11-11 19:56:26 +0100297 Must return a Boolean value; if the value is :const:`True`, the request will
298 be processed, and if it's :const:`False`, the request will be denied. This
299 function can be overridden to implement access controls for a server. The
300 default implementation always returns :const:`True`.
Georg Brandl116aa622007-08-15 14:28:22 +0000301
302
303RequestHandler Objects
304----------------------
305
306The request handler class must define a new :meth:`handle` method, and can
307override any of the following methods. A new instance is created for each
308request.
309
310
Benjamin Petersond23f8222009-04-05 19:13:16 +0000311.. method:: RequestHandler.finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000312
Georg Brandlb533e262008-05-25 18:19:30 +0000313 Called after the :meth:`handle` method to perform any clean-up actions
314 required. The default implementation does nothing. If :meth:`setup` or
315 :meth:`handle` raise an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000316
317
Benjamin Petersond23f8222009-04-05 19:13:16 +0000318.. method:: RequestHandler.handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000319
Georg Brandlb533e262008-05-25 18:19:30 +0000320 This function must do all the work required to service a request. The
321 default implementation does nothing. Several instance attributes are
322 available to it; the request is available as :attr:`self.request`; the client
323 address as :attr:`self.client_address`; and the server instance as
324 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000325
Georg Brandlb533e262008-05-25 18:19:30 +0000326 The type of :attr:`self.request` is different for datagram or stream
327 services. For stream services, :attr:`self.request` is a socket object; for
328 datagram services, :attr:`self.request` is a pair of string and socket.
329 However, this can be hidden by using the request handler subclasses
330 :class:`StreamRequestHandler` or :class:`DatagramRequestHandler`, which
331 override the :meth:`setup` and :meth:`finish` methods, and provide
332 :attr:`self.rfile` and :attr:`self.wfile` attributes. :attr:`self.rfile` and
333 :attr:`self.wfile` can be read or written, respectively, to get the request
334 data or return data to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000335
336
Benjamin Petersond23f8222009-04-05 19:13:16 +0000337.. method:: RequestHandler.setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000338
339 Called before the :meth:`handle` method to perform any initialization actions
340 required. The default implementation does nothing.
341
Georg Brandlb533e262008-05-25 18:19:30 +0000342
343Examples
344--------
345
346:class:`socketserver.TCPServer` Example
347~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
348
349This is the server side::
350
351 import socketserver
352
353 class MyTCPHandler(socketserver.BaseRequestHandler):
354 """
355 The RequestHandler class for our server.
356
357 It is instantiated once per connection to the server, and must
358 override the handle() method to implement communication to the
359 client.
360 """
361
362 def handle(self):
363 # self.request is the TCP socket connected to the client
364 self.data = self.request.recv(1024).strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200365 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000366 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000367 # just send back the same data, but upper-cased
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800368 self.request.sendall(self.data.upper())
Georg Brandlb533e262008-05-25 18:19:30 +0000369
370 if __name__ == "__main__":
371 HOST, PORT = "localhost", 9999
372
373 # Create the server, binding to localhost on port 9999
374 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
375
376 # Activate the server; this will keep running until you
377 # interrupt the program with Ctrl-C
378 server.serve_forever()
379
380An alternative request handler class that makes use of streams (file-like
381objects that simplify communication by providing the standard file interface)::
382
383 class MyTCPHandler(socketserver.StreamRequestHandler):
384
385 def handle(self):
386 # self.rfile is a file-like object created by the handler;
387 # we can now use e.g. readline() instead of raw recv() calls
388 self.data = self.rfile.readline().strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200389 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000390 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000391 # Likewise, self.wfile is a file-like object used to write back
392 # to the client
393 self.wfile.write(self.data.upper())
394
395The difference is that the ``readline()`` call in the second handler will call
396``recv()`` multiple times until it encounters a newline character, while the
397single ``recv()`` call in the first handler will just return what has been sent
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800398from the client in one ``sendall()`` call.
Georg Brandlb533e262008-05-25 18:19:30 +0000399
400
401This is the client side::
402
403 import socket
404 import sys
405
406 HOST, PORT = "localhost", 9999
407 data = " ".join(sys.argv[1:])
408
409 # Create a socket (SOCK_STREAM means a TCP socket)
410 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
411
Florent Xicluna023611f2011-10-23 22:40:37 +0200412 try:
413 # Connect to server and send data
414 sock.connect((HOST, PORT))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800415 sock.sendall(bytes(data + "\n", "utf-8"))
Georg Brandlb533e262008-05-25 18:19:30 +0000416
Florent Xicluna023611f2011-10-23 22:40:37 +0200417 # Receive data from the server and shut down
418 received = str(sock.recv(1024), "utf-8")
419 finally:
420 sock.close()
Georg Brandlb533e262008-05-25 18:19:30 +0000421
Florent Xicluna023611f2011-10-23 22:40:37 +0200422 print("Sent: {}".format(data))
423 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000424
425
426The output of the example should look something like this:
427
428Server::
429
430 $ python TCPServer.py
431 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000432 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000433 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000434 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000435
436Client::
437
438 $ python TCPClient.py hello world with TCP
439 Sent: hello world with TCP
Florent Xicluna023611f2011-10-23 22:40:37 +0200440 Received: HELLO WORLD WITH TCP
Georg Brandlb533e262008-05-25 18:19:30 +0000441 $ python TCPClient.py python is nice
442 Sent: python is nice
Florent Xicluna023611f2011-10-23 22:40:37 +0200443 Received: PYTHON IS NICE
Georg Brandlb533e262008-05-25 18:19:30 +0000444
445
446:class:`socketserver.UDPServer` Example
447~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
448
449This is the server side::
450
451 import socketserver
452
453 class MyUDPHandler(socketserver.BaseRequestHandler):
454 """
455 This class works similar to the TCP handler class, except that
456 self.request consists of a pair of data and client socket, and since
457 there is no connection the client address must be given explicitly
458 when sending data back via sendto().
459 """
460
461 def handle(self):
462 data = self.request[0].strip()
463 socket = self.request[1]
Florent Xicluna023611f2011-10-23 22:40:37 +0200464 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000465 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000466 socket.sendto(data.upper(), self.client_address)
467
468 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000469 HOST, PORT = "localhost", 9999
470 server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
471 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000472
473This is the client side::
474
475 import socket
476 import sys
477
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000478 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000479 data = " ".join(sys.argv[1:])
480
481 # SOCK_DGRAM is the socket type to use for UDP sockets
482 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
483
484 # As you can see, there is no connect() call; UDP has no connections.
485 # Instead, data is directly sent to the recipient via sendto().
Florent Xicluna023611f2011-10-23 22:40:37 +0200486 sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
487 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000488
Florent Xicluna023611f2011-10-23 22:40:37 +0200489 print("Sent: {}".format(data))
490 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000491
492The output of the example should look exactly like for the TCP server example.
493
494
495Asynchronous Mixins
496~~~~~~~~~~~~~~~~~~~
497
498To build asynchronous handlers, use the :class:`ThreadingMixIn` and
499:class:`ForkingMixIn` classes.
500
501An example for the :class:`ThreadingMixIn` class::
502
503 import socket
504 import threading
505 import socketserver
506
507 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
508
509 def handle(self):
Florent Xicluna023611f2011-10-23 22:40:37 +0200510 data = str(self.request.recv(1024), 'ascii')
Georg Brandlf9926402008-06-13 06:32:25 +0000511 cur_thread = threading.current_thread()
Florent Xicluna023611f2011-10-23 22:40:37 +0200512 response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800513 self.request.sendall(response)
Georg Brandlb533e262008-05-25 18:19:30 +0000514
515 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
516 pass
517
518 def client(ip, port, message):
519 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
520 sock.connect((ip, port))
Florent Xicluna023611f2011-10-23 22:40:37 +0200521 try:
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800522 sock.sendall(bytes(message, 'ascii'))
Florent Xicluna023611f2011-10-23 22:40:37 +0200523 response = str(sock.recv(1024), 'ascii')
524 print("Received: {}".format(response))
525 finally:
526 sock.close()
Georg Brandlb533e262008-05-25 18:19:30 +0000527
528 if __name__ == "__main__":
529 # Port 0 means to select an arbitrary unused port
530 HOST, PORT = "localhost", 0
531
532 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
533 ip, port = server.server_address
534
535 # Start a thread with the server -- that thread will then start one
536 # more thread for each request
537 server_thread = threading.Thread(target=server.serve_forever)
538 # Exit the server thread when the main thread terminates
Florent Xicluna023611f2011-10-23 22:40:37 +0200539 server_thread.daemon = True
Georg Brandlb533e262008-05-25 18:19:30 +0000540 server_thread.start()
Benjamin Petersond75fcb42009-02-19 04:22:03 +0000541 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000542
Florent Xicluna023611f2011-10-23 22:40:37 +0200543 client(ip, port, "Hello World 1")
544 client(ip, port, "Hello World 2")
545 client(ip, port, "Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000546
547 server.shutdown()
548
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000549
Georg Brandlb533e262008-05-25 18:19:30 +0000550The output of the example should look something like this::
551
552 $ python ThreadedTCPServer.py
553 Server loop running in thread: Thread-1
Florent Xicluna023611f2011-10-23 22:40:37 +0200554 Received: Thread-2: Hello World 1
555 Received: Thread-3: Hello World 2
556 Received: Thread-4: Hello World 3
Georg Brandlb533e262008-05-25 18:19:30 +0000557
558
559The :class:`ForkingMixIn` class is used in the same way, except that the server
560will spawn a new process for each request.