blob: dac928124fa1724b6bf26c347585df9114320fd6 [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
Martin Pantereac17b82016-02-19 03:27:46 +000013There are four basic concrete server classes:
14
15
16.. class:: TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
17
18 This uses the Internet TCP protocol, which provides for
19 continuous streams of data between the client and server.
20 If *bind_and_activate* is true, the constructor automatically attempts to
21 invoke :meth:`~BaseServer.server_bind` and
22 :meth:`~BaseServer.server_activate`. The other parameters are passed to
23 the :class:`BaseServer` base class.
24
25
26.. class:: UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
27
28 This uses datagrams, which are discrete packets of information that may
29 arrive out of order or be lost while in transit. The parameters are
30 the same as for :class:`TCPServer`.
31
32
33.. class:: UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
34 UnixDatagramServer(server_address, RequestHandlerClass, bind_and_activate=True)
35
36 These more infrequently used classes are similar to the TCP and
37 UDP classes, but use Unix domain sockets; they're not available on
38 non-Unix platforms. The parameters are the same as for
39 :class:`TCPServer`.
40
Georg Brandl116aa622007-08-15 14:28:22 +000041
42These four classes process requests :dfn:`synchronously`; each request must be
43completed before the next request can be started. This isn't suitable if each
44request takes a long time to complete, because it requires a lot of computation,
45or because it returns a lot of data which the client is slow to process. The
46solution is to create a separate process or thread to handle each request; the
47:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes can be used to
48support asynchronous behaviour.
49
50Creating a server requires several steps. First, you must create a request
51handler class by subclassing the :class:`BaseRequestHandler` class and
Martin Pantereac17b82016-02-19 03:27:46 +000052overriding its :meth:`~BaseRequestHandler.handle` method;
53this method will process incoming
Georg Brandl116aa622007-08-15 14:28:22 +000054requests. Second, you must instantiate one of the server classes, passing it
Martin Panter0cab9c12016-04-13 00:36:52 +000055the server's address and the request handler class. It is recommended to use
56the server in a :keyword:`with` statement. Then call the
Martin Pantereac17b82016-02-19 03:27:46 +000057:meth:`~BaseServer.handle_request` or
58:meth:`~BaseServer.serve_forever` method of the server object to
Robert Collins1ee92832015-07-29 12:52:40 +120059process one or many requests. Finally, call :meth:`~BaseServer.server_close`
Martin Panter0cab9c12016-04-13 00:36:52 +000060to close the socket (unless you used a :keyword:`with` statement).
Georg Brandl116aa622007-08-15 14:28:22 +000061
62When inheriting from :class:`ThreadingMixIn` for threaded connection behavior,
63you should explicitly declare how you want your threads to behave on an abrupt
Florent Xicluna599d76b2011-11-11 19:56:26 +010064shutdown. The :class:`ThreadingMixIn` class defines an attribute
Georg Brandl116aa622007-08-15 14:28:22 +000065*daemon_threads*, which indicates whether or not the server should wait for
Florent Xicluna599d76b2011-11-11 19:56:26 +010066thread termination. You should set the flag explicitly if you would like
67threads to behave autonomously; the default is :const:`False`, meaning that
68Python will not exit until all threads created by :class:`ThreadingMixIn` have
69exited.
Georg Brandl116aa622007-08-15 14:28:22 +000070
71Server classes have the same external methods and attributes, no matter what
Georg Brandlfceab5a2008-01-19 20:08:23 +000072network protocol they use.
Georg Brandl116aa622007-08-15 14:28:22 +000073
74
75Server Creation Notes
76---------------------
77
78There are five classes in an inheritance diagram, four of which represent
79synchronous servers of four types::
80
81 +------------+
82 | BaseServer |
83 +------------+
84 |
85 v
86 +-----------+ +------------------+
87 | TCPServer |------->| UnixStreamServer |
88 +-----------+ +------------------+
89 |
90 v
91 +-----------+ +--------------------+
92 | UDPServer |------->| UnixDatagramServer |
93 +-----------+ +--------------------+
94
95Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from
96:class:`UnixStreamServer` --- the only difference between an IP and a Unix
97stream server is the address family, which is simply repeated in both Unix
98server classes.
99
Georg Brandl116aa622007-08-15 14:28:22 +0000100
Martin Pantereac17b82016-02-19 03:27:46 +0000101.. class:: ForkingMixIn
102 ThreadingMixIn
Georg Brandl116aa622007-08-15 14:28:22 +0000103
Martin Pantereac17b82016-02-19 03:27:46 +0000104 Forking and threading versions of each type of server can be created
105 using these mix-in classes. For instance, :class:`ThreadingUDPServer`
106 is created as follows::
107
108 class ThreadingUDPServer(ThreadingMixIn, UDPServer):
109 pass
110
111 The mix-in class comes first, since it overrides a method defined in
112 :class:`UDPServer`. Setting the various attributes also changes the
113 behavior of the underlying server mechanism.
114
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)287e6872016-06-03 05:44:47 +0000115 :class:`ForkingMixIn` and the Forking classes mentioned below are
116 only available on POSIX platforms that support :func:`~os.fork`.
Martin Pantereac17b82016-02-19 03:27:46 +0000117
118.. class:: ForkingTCPServer
119 ForkingUDPServer
120 ThreadingTCPServer
121 ThreadingUDPServer
122
123 These classes are pre-defined using the mix-in classes.
124
Georg Brandl116aa622007-08-15 14:28:22 +0000125
126To implement a service, you must derive a class from :class:`BaseRequestHandler`
Martin Pantereac17b82016-02-19 03:27:46 +0000127and redefine its :meth:`~BaseRequestHandler.handle` method.
128You can then run various versions of
Georg Brandl116aa622007-08-15 14:28:22 +0000129the service by combining one of the server classes with your request handler
130class. The request handler class must be different for datagram or stream
131services. This can be hidden by using the handler subclasses
132:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
133
134Of course, you still have to use your head! For instance, it makes no sense to
135use a forking server if the service contains state in memory that can be
136modified by different requests, since the modifications in the child process
137would never reach the initial state kept in the parent process and passed to
138each child. In this case, you can use a threading server, but you will probably
139have to use locks to protect the integrity of the shared data.
140
141On the other hand, if you are building an HTTP server where all data is stored
142externally (for instance, in the file system), a synchronous class will
143essentially render the service "deaf" while one request is being handled --
144which may be for a very long time if a client is slow to receive all the data it
145has requested. Here a threading or forking server is appropriate.
146
147In some cases, it may be appropriate to process part of a request synchronously,
148but to finish processing in a forked child depending on the request data. This
149can be implemented by using a synchronous server and doing an explicit fork in
Martin Pantereac17b82016-02-19 03:27:46 +0000150the request handler class :meth:`~BaseRequestHandler.handle` method.
Georg Brandl116aa622007-08-15 14:28:22 +0000151
152Another approach to handling multiple simultaneous requests in an environment
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300153that supports neither threads nor :func:`~os.fork` (or where these are too
154expensive or inappropriate for the service) is to maintain an explicit table of
Charles-François Natali1d29cc52014-03-24 22:25:39 +0000155partially finished requests and to use :mod:`selectors` to decide which
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300156request to work on next (or whether to handle a new incoming request). This is
157particularly important for stream services where each client can potentially be
158connected for a long time (if threads or subprocesses cannot be used). See
159:mod:`asyncore` for another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000160
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000161.. XXX should data and methods be intermingled, or separate?
162 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000163
164
165Server Objects
166--------------
167
Martin Pantereac17b82016-02-19 03:27:46 +0000168.. class:: BaseServer(server_address, RequestHandlerClass)
Georg Brandl116aa622007-08-15 14:28:22 +0000169
Benjamin Petersond23f8222009-04-05 19:13:16 +0000170 This is the superclass of all Server objects in the module. It defines the
171 interface, given below, but does not implement most of the methods, which is
Martin Pantereac17b82016-02-19 03:27:46 +0000172 done in subclasses. The two parameters are stored in the respective
173 :attr:`server_address` and :attr:`RequestHandlerClass` attributes.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000174
175
Martin Pantereac17b82016-02-19 03:27:46 +0000176 .. method:: fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000177
Martin Pantereac17b82016-02-19 03:27:46 +0000178 Return an integer file descriptor for the socket on which the server is
179 listening. This function is most commonly passed to :mod:`selectors`, to
180 allow monitoring multiple servers in the same process.
Georg Brandl116aa622007-08-15 14:28:22 +0000181
182
Martin Pantereac17b82016-02-19 03:27:46 +0000183 .. method:: handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000184
Martin Pantereac17b82016-02-19 03:27:46 +0000185 Process a single request. This function calls the following methods in
186 order: :meth:`get_request`, :meth:`verify_request`, and
187 :meth:`process_request`. If the user-provided
188 :meth:`~BaseRequestHandler.handle` method of the
189 handler class raises an exception, the server's :meth:`handle_error` method
190 will be called. If no request is received within :attr:`timeout`
191 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
192 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000193
194
Martin Pantereac17b82016-02-19 03:27:46 +0000195 .. method:: serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000196
Martin Pantereac17b82016-02-19 03:27:46 +0000197 Handle requests until an explicit :meth:`shutdown` request. Poll for
198 shutdown every *poll_interval* seconds.
199 Ignores the :attr:`timeout` attribute. It
200 also calls :meth:`service_actions`, which may be used by a subclass or mixin
201 to provide actions specific to a given service. For example, the
202 :class:`ForkingMixIn` class uses :meth:`service_actions` to clean up zombie
203 child processes.
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000204
Martin Pantereac17b82016-02-19 03:27:46 +0000205 .. versionchanged:: 3.3
206 Added ``service_actions`` call to the ``serve_forever`` method.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800207
208
Martin Pantereac17b82016-02-19 03:27:46 +0000209 .. method:: service_actions()
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800210
Martin Pantereac17b82016-02-19 03:27:46 +0000211 This is called in the :meth:`serve_forever` loop. This method can be
212 overridden by subclasses or mixin classes to perform actions specific to
213 a given service, such as cleanup actions.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800214
Martin Pantereac17b82016-02-19 03:27:46 +0000215 .. versionadded:: 3.3
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000216
Martin Pantereac17b82016-02-19 03:27:46 +0000217 .. method:: shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000218
Martin Pantereac17b82016-02-19 03:27:46 +0000219 Tell the :meth:`serve_forever` loop to stop and wait until it does.
Georg Brandl116aa622007-08-15 14:28:22 +0000220
221
Martin Pantereac17b82016-02-19 03:27:46 +0000222 .. method:: server_close()
Robert Collins1ee92832015-07-29 12:52:40 +1200223
Martin Pantereac17b82016-02-19 03:27:46 +0000224 Clean up the server. May be overridden.
225
226
227 .. attribute:: address_family
228
229 The family of protocols to which the server's socket belongs.
230 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Robert Collins1ee92832015-07-29 12:52:40 +1200231
Robert Collins1ee92832015-07-29 12:52:40 +1200232
Martin Pantereac17b82016-02-19 03:27:46 +0000233 .. attribute:: RequestHandlerClass
Robert Collins1ee92832015-07-29 12:52:40 +1200234
Martin Pantereac17b82016-02-19 03:27:46 +0000235 The user-provided request handler class; an instance of this class is created
236 for each request.
Georg Brandl116aa622007-08-15 14:28:22 +0000237
Georg Brandl116aa622007-08-15 14:28:22 +0000238
Martin Pantereac17b82016-02-19 03:27:46 +0000239 .. attribute:: server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000240
Martin Pantereac17b82016-02-19 03:27:46 +0000241 The address on which the server is listening. The format of addresses varies
242 depending on the protocol family;
243 see the documentation for the :mod:`socket` module
244 for details. For Internet protocols, this is a tuple containing a string giving
245 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
Georg Brandl116aa622007-08-15 14:28:22 +0000246
Georg Brandl116aa622007-08-15 14:28:22 +0000247
Martin Pantereac17b82016-02-19 03:27:46 +0000248 .. attribute:: socket
Georg Brandl116aa622007-08-15 14:28:22 +0000249
Martin Pantereac17b82016-02-19 03:27:46 +0000250 The socket object on which the server will listen for incoming requests.
Georg Brandl116aa622007-08-15 14:28:22 +0000251
Georg Brandl116aa622007-08-15 14:28:22 +0000252
Martin Pantereac17b82016-02-19 03:27:46 +0000253 The server classes support the following class variables:
Georg Brandl116aa622007-08-15 14:28:22 +0000254
Martin Pantereac17b82016-02-19 03:27:46 +0000255 .. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000256
Martin Pantereac17b82016-02-19 03:27:46 +0000257 .. attribute:: allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000258
Martin Pantereac17b82016-02-19 03:27:46 +0000259 Whether the server will allow the reuse of an address. This defaults to
260 :const:`False`, and can be set in subclasses to change the policy.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000261
Georg Brandl116aa622007-08-15 14:28:22 +0000262
Martin Pantereac17b82016-02-19 03:27:46 +0000263 .. attribute:: request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000264
Martin Pantereac17b82016-02-19 03:27:46 +0000265 The size of the request queue. If it takes a long time to process a single
266 request, any requests that arrive while the server is busy are placed into a
267 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
268 further requests from clients will get a "Connection denied" error. The default
269 value is usually 5, but this can be overridden by subclasses.
Georg Brandl116aa622007-08-15 14:28:22 +0000270
Georg Brandl116aa622007-08-15 14:28:22 +0000271
Martin Pantereac17b82016-02-19 03:27:46 +0000272 .. attribute:: socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000273
Martin Pantereac17b82016-02-19 03:27:46 +0000274 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
275 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000276
Georg Brandl116aa622007-08-15 14:28:22 +0000277
Martin Pantereac17b82016-02-19 03:27:46 +0000278 .. attribute:: timeout
Georg Brandl116aa622007-08-15 14:28:22 +0000279
Martin Pantereac17b82016-02-19 03:27:46 +0000280 Timeout duration, measured in seconds, or :const:`None` if no timeout is
281 desired. If :meth:`handle_request` receives no incoming requests within the
282 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandl116aa622007-08-15 14:28:22 +0000283
Georg Brandl116aa622007-08-15 14:28:22 +0000284
Martin Pantereac17b82016-02-19 03:27:46 +0000285 There are various server methods that can be overridden by subclasses of base
286 server classes like :class:`TCPServer`; these methods aren't useful to external
287 users of the server object.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000288
Martin Pantereac17b82016-02-19 03:27:46 +0000289 .. XXX should the default implementations of these be documented, or should
290 it be assumed that the user will look at socketserver.py?
Georg Brandlfceab5a2008-01-19 20:08:23 +0000291
Martin Pantereac17b82016-02-19 03:27:46 +0000292 .. method:: finish_request()
Georg Brandlfceab5a2008-01-19 20:08:23 +0000293
Martin Pantereac17b82016-02-19 03:27:46 +0000294 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
295 calling its :meth:`~BaseRequestHandler.handle` method.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000296
Georg Brandl116aa622007-08-15 14:28:22 +0000297
Martin Pantereac17b82016-02-19 03:27:46 +0000298 .. method:: get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000299
Martin Pantereac17b82016-02-19 03:27:46 +0000300 Must accept a request from the socket, and return a 2-tuple containing the *new*
301 socket object to be used to communicate with the client, and the client's
302 address.
Georg Brandl116aa622007-08-15 14:28:22 +0000303
Georg Brandl116aa622007-08-15 14:28:22 +0000304
Martin Pantereac17b82016-02-19 03:27:46 +0000305 .. method:: handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000306
Martin Pantereac17b82016-02-19 03:27:46 +0000307 This function is called if the :meth:`~BaseRequestHandler.handle`
308 method of a :attr:`RequestHandlerClass` instance raises
309 an exception. The default action is to print the traceback to
Martin Panterd9108d12016-02-21 08:49:56 +0000310 standard error and continue handling further requests.
311
312 .. versionchanged:: 3.6
313 Now only called for exceptions derived from the :exc:`Exception`
314 class.
Georg Brandl116aa622007-08-15 14:28:22 +0000315
Georg Brandl116aa622007-08-15 14:28:22 +0000316
Martin Pantereac17b82016-02-19 03:27:46 +0000317 .. method:: handle_timeout()
Georg Brandl116aa622007-08-15 14:28:22 +0000318
Martin Pantereac17b82016-02-19 03:27:46 +0000319 This function is called when the :attr:`timeout` attribute has been set to a
320 value other than :const:`None` and the timeout period has passed with no
321 requests being received. The default action for forking servers is
322 to collect the status of any child processes that have exited, while
323 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000324
Georg Brandl116aa622007-08-15 14:28:22 +0000325
Martin Pantereac17b82016-02-19 03:27:46 +0000326 .. method:: process_request(request, client_address)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000327
Martin Pantereac17b82016-02-19 03:27:46 +0000328 Calls :meth:`finish_request` to create an instance of the
329 :attr:`RequestHandlerClass`. If desired, this function can create a new process
330 or thread to handle the request; the :class:`ForkingMixIn` and
331 :class:`ThreadingMixIn` classes do this.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000332
Georg Brandl116aa622007-08-15 14:28:22 +0000333
Martin Pantereac17b82016-02-19 03:27:46 +0000334 .. Is there any point in documenting the following two functions?
335 What would the purpose of overriding them be: initializing server
336 instance variables, adding new network families?
Benjamin Petersond23f8222009-04-05 19:13:16 +0000337
Martin Pantereac17b82016-02-19 03:27:46 +0000338 .. method:: server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000339
Martin Pantereac17b82016-02-19 03:27:46 +0000340 Called by the server's constructor to activate the server. The default behavior
341 for a TCP server just invokes :meth:`~socket.socket.listen`
342 on the server's socket. May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000343
Benjamin Petersond23f8222009-04-05 19:13:16 +0000344
Martin Pantereac17b82016-02-19 03:27:46 +0000345 .. method:: server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000346
Martin Pantereac17b82016-02-19 03:27:46 +0000347 Called by the server's constructor to bind the socket to the desired address.
348 May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000349
Georg Brandl116aa622007-08-15 14:28:22 +0000350
Martin Pantereac17b82016-02-19 03:27:46 +0000351 .. method:: verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000352
Martin Pantereac17b82016-02-19 03:27:46 +0000353 Must return a Boolean value; if the value is :const:`True`, the request will
354 be processed, and if it's :const:`False`, the request will be denied. This
355 function can be overridden to implement access controls for a server. The
356 default implementation always returns :const:`True`.
Georg Brandl116aa622007-08-15 14:28:22 +0000357
Georg Brandl116aa622007-08-15 14:28:22 +0000358
Martin Panter0cab9c12016-04-13 00:36:52 +0000359 .. versionchanged:: 3.6
360 Support for the :term:`context manager` protocol was added. Exiting the
361 context manager is equivalent to calling :meth:`server_close`.
362
363
Martin Pantereac17b82016-02-19 03:27:46 +0000364Request Handler Objects
365-----------------------
Georg Brandl116aa622007-08-15 14:28:22 +0000366
Martin Pantereac17b82016-02-19 03:27:46 +0000367.. class:: BaseRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000368
Martin Pantereac17b82016-02-19 03:27:46 +0000369 This is the superclass of all request handler objects. It defines
370 the interface, given below. A concrete request handler subclass must
371 define a new :meth:`handle` method, and can override any of
372 the other methods. A new instance of the subclass is created for each
373 request.
Georg Brandl116aa622007-08-15 14:28:22 +0000374
375
Martin Pantereac17b82016-02-19 03:27:46 +0000376 .. method:: setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000377
Martin Pantereac17b82016-02-19 03:27:46 +0000378 Called before the :meth:`handle` method to perform any initialization actions
379 required. The default implementation does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000380
381
Martin Pantereac17b82016-02-19 03:27:46 +0000382 .. method:: handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000383
Martin Pantereac17b82016-02-19 03:27:46 +0000384 This function must do all the work required to service a request. The
385 default implementation does nothing. Several instance attributes are
386 available to it; the request is available as :attr:`self.request`; the client
387 address as :attr:`self.client_address`; and the server instance as
388 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000389
Martin Pantereac17b82016-02-19 03:27:46 +0000390 The type of :attr:`self.request` is different for datagram or stream
391 services. For stream services, :attr:`self.request` is a socket object; for
392 datagram services, :attr:`self.request` is a pair of string and socket.
Georg Brandl116aa622007-08-15 14:28:22 +0000393
Georg Brandl116aa622007-08-15 14:28:22 +0000394
Martin Pantereac17b82016-02-19 03:27:46 +0000395 .. method:: finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000396
Martin Pantereac17b82016-02-19 03:27:46 +0000397 Called after the :meth:`handle` method to perform any clean-up actions
398 required. The default implementation does nothing. If :meth:`setup`
399 raises an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000400
401
Martin Pantereac17b82016-02-19 03:27:46 +0000402.. class:: StreamRequestHandler
403 DatagramRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000404
Martin Pantereac17b82016-02-19 03:27:46 +0000405 These :class:`BaseRequestHandler` subclasses override the
406 :meth:`~BaseRequestHandler.setup` and :meth:`~BaseRequestHandler.finish`
407 methods, and provide :attr:`self.rfile` and :attr:`self.wfile` attributes.
408 The :attr:`self.rfile` and :attr:`self.wfile` attributes can be
409 read or written, respectively, to get the request data or return data
410 to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000411
Georg Brandlb533e262008-05-25 18:19:30 +0000412
413Examples
414--------
415
416:class:`socketserver.TCPServer` Example
417~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
418
419This is the server side::
420
421 import socketserver
422
423 class MyTCPHandler(socketserver.BaseRequestHandler):
424 """
Martin Pantereac17b82016-02-19 03:27:46 +0000425 The request handler class for our server.
Georg Brandlb533e262008-05-25 18:19:30 +0000426
427 It is instantiated once per connection to the server, and must
428 override the handle() method to implement communication to the
429 client.
430 """
431
432 def handle(self):
433 # self.request is the TCP socket connected to the client
434 self.data = self.request.recv(1024).strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200435 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000436 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000437 # just send back the same data, but upper-cased
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800438 self.request.sendall(self.data.upper())
Georg Brandlb533e262008-05-25 18:19:30 +0000439
440 if __name__ == "__main__":
441 HOST, PORT = "localhost", 9999
442
443 # Create the server, binding to localhost on port 9999
Martin Panter0cab9c12016-04-13 00:36:52 +0000444 with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
445 # Activate the server; this will keep running until you
446 # interrupt the program with Ctrl-C
447 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000448
449An alternative request handler class that makes use of streams (file-like
450objects that simplify communication by providing the standard file interface)::
451
452 class MyTCPHandler(socketserver.StreamRequestHandler):
453
454 def handle(self):
455 # self.rfile is a file-like object created by the handler;
456 # we can now use e.g. readline() instead of raw recv() calls
457 self.data = self.rfile.readline().strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200458 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000459 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000460 # Likewise, self.wfile is a file-like object used to write back
461 # to the client
462 self.wfile.write(self.data.upper())
463
464The difference is that the ``readline()`` call in the second handler will call
465``recv()`` multiple times until it encounters a newline character, while the
466single ``recv()`` call in the first handler will just return what has been sent
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800467from the client in one ``sendall()`` call.
Georg Brandlb533e262008-05-25 18:19:30 +0000468
469
470This is the client side::
471
472 import socket
473 import sys
474
475 HOST, PORT = "localhost", 9999
476 data = " ".join(sys.argv[1:])
477
478 # Create a socket (SOCK_STREAM means a TCP socket)
Martin Pantere37fc182016-04-24 04:24:36 +0000479 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
Florent Xicluna023611f2011-10-23 22:40:37 +0200480 # Connect to server and send data
481 sock.connect((HOST, PORT))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800482 sock.sendall(bytes(data + "\n", "utf-8"))
Georg Brandlb533e262008-05-25 18:19:30 +0000483
Florent Xicluna023611f2011-10-23 22:40:37 +0200484 # Receive data from the server and shut down
485 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000486
Florent Xicluna023611f2011-10-23 22:40:37 +0200487 print("Sent: {}".format(data))
488 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000489
490
491The output of the example should look something like this:
492
493Server::
494
495 $ python TCPServer.py
496 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000497 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000498 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000499 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000500
501Client::
502
503 $ python TCPClient.py hello world with TCP
504 Sent: hello world with TCP
Florent Xicluna023611f2011-10-23 22:40:37 +0200505 Received: HELLO WORLD WITH TCP
Georg Brandlb533e262008-05-25 18:19:30 +0000506 $ python TCPClient.py python is nice
507 Sent: python is nice
Florent Xicluna023611f2011-10-23 22:40:37 +0200508 Received: PYTHON IS NICE
Georg Brandlb533e262008-05-25 18:19:30 +0000509
510
511:class:`socketserver.UDPServer` Example
512~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
513
514This is the server side::
515
516 import socketserver
517
518 class MyUDPHandler(socketserver.BaseRequestHandler):
519 """
520 This class works similar to the TCP handler class, except that
521 self.request consists of a pair of data and client socket, and since
522 there is no connection the client address must be given explicitly
523 when sending data back via sendto().
524 """
525
526 def handle(self):
527 data = self.request[0].strip()
528 socket = self.request[1]
Florent Xicluna023611f2011-10-23 22:40:37 +0200529 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000530 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000531 socket.sendto(data.upper(), self.client_address)
532
533 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000534 HOST, PORT = "localhost", 9999
Martin Panter0cab9c12016-04-13 00:36:52 +0000535 with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
536 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000537
538This is the client side::
539
540 import socket
541 import sys
542
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000543 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000544 data = " ".join(sys.argv[1:])
545
546 # SOCK_DGRAM is the socket type to use for UDP sockets
547 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
548
549 # As you can see, there is no connect() call; UDP has no connections.
550 # Instead, data is directly sent to the recipient via sendto().
Florent Xicluna023611f2011-10-23 22:40:37 +0200551 sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
552 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000553
Florent Xicluna023611f2011-10-23 22:40:37 +0200554 print("Sent: {}".format(data))
555 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000556
557The output of the example should look exactly like for the TCP server example.
558
559
560Asynchronous Mixins
561~~~~~~~~~~~~~~~~~~~
562
563To build asynchronous handlers, use the :class:`ThreadingMixIn` and
564:class:`ForkingMixIn` classes.
565
566An example for the :class:`ThreadingMixIn` class::
567
568 import socket
569 import threading
570 import socketserver
571
572 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
573
574 def handle(self):
Florent Xicluna023611f2011-10-23 22:40:37 +0200575 data = str(self.request.recv(1024), 'ascii')
Georg Brandlf9926402008-06-13 06:32:25 +0000576 cur_thread = threading.current_thread()
Florent Xicluna023611f2011-10-23 22:40:37 +0200577 response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800578 self.request.sendall(response)
Georg Brandlb533e262008-05-25 18:19:30 +0000579
580 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
581 pass
582
583 def client(ip, port, message):
Martin Pantere37fc182016-04-24 04:24:36 +0000584 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
585 sock.connect((ip, port))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800586 sock.sendall(bytes(message, 'ascii'))
Florent Xicluna023611f2011-10-23 22:40:37 +0200587 response = str(sock.recv(1024), 'ascii')
588 print("Received: {}".format(response))
Georg Brandlb533e262008-05-25 18:19:30 +0000589
590 if __name__ == "__main__":
591 # Port 0 means to select an arbitrary unused port
592 HOST, PORT = "localhost", 0
593
594 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
Martin Panter0cab9c12016-04-13 00:36:52 +0000595 with server:
596 ip, port = server.server_address
Georg Brandlb533e262008-05-25 18:19:30 +0000597
Martin Panter0cab9c12016-04-13 00:36:52 +0000598 # Start a thread with the server -- that thread will then start one
599 # more thread for each request
600 server_thread = threading.Thread(target=server.serve_forever)
601 # Exit the server thread when the main thread terminates
602 server_thread.daemon = True
603 server_thread.start()
604 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000605
Martin Panter0cab9c12016-04-13 00:36:52 +0000606 client(ip, port, "Hello World 1")
607 client(ip, port, "Hello World 2")
608 client(ip, port, "Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000609
Martin Panter0cab9c12016-04-13 00:36:52 +0000610 server.shutdown()
Georg Brandlb533e262008-05-25 18:19:30 +0000611
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000612
Georg Brandlb533e262008-05-25 18:19:30 +0000613The output of the example should look something like this::
614
615 $ python ThreadedTCPServer.py
616 Server loop running in thread: Thread-1
Florent Xicluna023611f2011-10-23 22:40:37 +0200617 Received: Thread-2: Hello World 1
618 Received: Thread-3: Hello World 2
619 Received: Thread-4: Hello World 3
Georg Brandlb533e262008-05-25 18:19:30 +0000620
621
622The :class:`ForkingMixIn` class is used in the same way, except that the server
623will spawn a new process for each request.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)287e6872016-06-03 05:44:47 +0000624Available only on POSIX platforms that support :func:`~os.fork`.
625