blob: e148d300691c9eca8060b6e005bc48f56e813f9e [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
115
116.. class:: ForkingTCPServer
117 ForkingUDPServer
118 ThreadingTCPServer
119 ThreadingUDPServer
120
121 These classes are pre-defined using the mix-in classes.
122
Georg Brandl116aa622007-08-15 14:28:22 +0000123
124To implement a service, you must derive a class from :class:`BaseRequestHandler`
Martin Pantereac17b82016-02-19 03:27:46 +0000125and redefine its :meth:`~BaseRequestHandler.handle` method.
126You can then run various versions of
Georg Brandl116aa622007-08-15 14:28:22 +0000127the service by combining one of the server classes with your request handler
128class. The request handler class must be different for datagram or stream
129services. This can be hidden by using the handler subclasses
130:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
131
132Of course, you still have to use your head! For instance, it makes no sense to
133use a forking server if the service contains state in memory that can be
134modified by different requests, since the modifications in the child process
135would never reach the initial state kept in the parent process and passed to
136each child. In this case, you can use a threading server, but you will probably
137have to use locks to protect the integrity of the shared data.
138
139On the other hand, if you are building an HTTP server where all data is stored
140externally (for instance, in the file system), a synchronous class will
141essentially render the service "deaf" while one request is being handled --
142which may be for a very long time if a client is slow to receive all the data it
143has requested. Here a threading or forking server is appropriate.
144
145In some cases, it may be appropriate to process part of a request synchronously,
146but to finish processing in a forked child depending on the request data. This
147can be implemented by using a synchronous server and doing an explicit fork in
Martin Pantereac17b82016-02-19 03:27:46 +0000148the request handler class :meth:`~BaseRequestHandler.handle` method.
Georg Brandl116aa622007-08-15 14:28:22 +0000149
150Another approach to handling multiple simultaneous requests in an environment
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300151that supports neither threads nor :func:`~os.fork` (or where these are too
152expensive or inappropriate for the service) is to maintain an explicit table of
Charles-François Natali1d29cc52014-03-24 22:25:39 +0000153partially finished requests and to use :mod:`selectors` to decide which
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300154request to work on next (or whether to handle a new incoming request). This is
155particularly important for stream services where each client can potentially be
156connected for a long time (if threads or subprocesses cannot be used). See
157:mod:`asyncore` for another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000158
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000159.. XXX should data and methods be intermingled, or separate?
160 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000161
162
163Server Objects
164--------------
165
Martin Pantereac17b82016-02-19 03:27:46 +0000166.. class:: BaseServer(server_address, RequestHandlerClass)
Georg Brandl116aa622007-08-15 14:28:22 +0000167
Benjamin Petersond23f8222009-04-05 19:13:16 +0000168 This is the superclass of all Server objects in the module. It defines the
169 interface, given below, but does not implement most of the methods, which is
Martin Pantereac17b82016-02-19 03:27:46 +0000170 done in subclasses. The two parameters are stored in the respective
171 :attr:`server_address` and :attr:`RequestHandlerClass` attributes.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000172
173
Martin Pantereac17b82016-02-19 03:27:46 +0000174 .. method:: fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000175
Martin Pantereac17b82016-02-19 03:27:46 +0000176 Return an integer file descriptor for the socket on which the server is
177 listening. This function is most commonly passed to :mod:`selectors`, to
178 allow monitoring multiple servers in the same process.
Georg Brandl116aa622007-08-15 14:28:22 +0000179
180
Martin Pantereac17b82016-02-19 03:27:46 +0000181 .. method:: handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000182
Martin Pantereac17b82016-02-19 03:27:46 +0000183 Process a single request. This function calls the following methods in
184 order: :meth:`get_request`, :meth:`verify_request`, and
185 :meth:`process_request`. If the user-provided
186 :meth:`~BaseRequestHandler.handle` method of the
187 handler class raises an exception, the server's :meth:`handle_error` method
188 will be called. If no request is received within :attr:`timeout`
189 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
190 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000191
192
Martin Pantereac17b82016-02-19 03:27:46 +0000193 .. method:: serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000194
Martin Pantereac17b82016-02-19 03:27:46 +0000195 Handle requests until an explicit :meth:`shutdown` request. Poll for
196 shutdown every *poll_interval* seconds.
197 Ignores the :attr:`timeout` attribute. It
198 also calls :meth:`service_actions`, which may be used by a subclass or mixin
199 to provide actions specific to a given service. For example, the
200 :class:`ForkingMixIn` class uses :meth:`service_actions` to clean up zombie
201 child processes.
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000202
Martin Pantereac17b82016-02-19 03:27:46 +0000203 .. versionchanged:: 3.3
204 Added ``service_actions`` call to the ``serve_forever`` method.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800205
206
Martin Pantereac17b82016-02-19 03:27:46 +0000207 .. method:: service_actions()
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800208
Martin Pantereac17b82016-02-19 03:27:46 +0000209 This is called in the :meth:`serve_forever` loop. This method can be
210 overridden by subclasses or mixin classes to perform actions specific to
211 a given service, such as cleanup actions.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800212
Martin Pantereac17b82016-02-19 03:27:46 +0000213 .. versionadded:: 3.3
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000214
Martin Pantereac17b82016-02-19 03:27:46 +0000215 .. method:: shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000216
Martin Pantereac17b82016-02-19 03:27:46 +0000217 Tell the :meth:`serve_forever` loop to stop and wait until it does.
Georg Brandl116aa622007-08-15 14:28:22 +0000218
219
Martin Pantereac17b82016-02-19 03:27:46 +0000220 .. method:: server_close()
Robert Collins1ee92832015-07-29 12:52:40 +1200221
Martin Pantereac17b82016-02-19 03:27:46 +0000222 Clean up the server. May be overridden.
223
224
225 .. attribute:: address_family
226
227 The family of protocols to which the server's socket belongs.
228 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Robert Collins1ee92832015-07-29 12:52:40 +1200229
Robert Collins1ee92832015-07-29 12:52:40 +1200230
Martin Pantereac17b82016-02-19 03:27:46 +0000231 .. attribute:: RequestHandlerClass
Robert Collins1ee92832015-07-29 12:52:40 +1200232
Martin Pantereac17b82016-02-19 03:27:46 +0000233 The user-provided request handler class; an instance of this class is created
234 for each request.
Georg Brandl116aa622007-08-15 14:28:22 +0000235
Georg Brandl116aa622007-08-15 14:28:22 +0000236
Martin Pantereac17b82016-02-19 03:27:46 +0000237 .. attribute:: server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000238
Martin Pantereac17b82016-02-19 03:27:46 +0000239 The address on which the server is listening. The format of addresses varies
240 depending on the protocol family;
241 see the documentation for the :mod:`socket` module
242 for details. For Internet protocols, this is a tuple containing a string giving
243 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
Georg Brandl116aa622007-08-15 14:28:22 +0000244
Georg Brandl116aa622007-08-15 14:28:22 +0000245
Martin Pantereac17b82016-02-19 03:27:46 +0000246 .. attribute:: socket
Georg Brandl116aa622007-08-15 14:28:22 +0000247
Martin Pantereac17b82016-02-19 03:27:46 +0000248 The socket object on which the server will listen for incoming requests.
Georg Brandl116aa622007-08-15 14:28:22 +0000249
Georg Brandl116aa622007-08-15 14:28:22 +0000250
Martin Pantereac17b82016-02-19 03:27:46 +0000251 The server classes support the following class variables:
Georg Brandl116aa622007-08-15 14:28:22 +0000252
Martin Pantereac17b82016-02-19 03:27:46 +0000253 .. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000254
Martin Pantereac17b82016-02-19 03:27:46 +0000255 .. attribute:: allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000256
Martin Pantereac17b82016-02-19 03:27:46 +0000257 Whether the server will allow the reuse of an address. This defaults to
258 :const:`False`, and can be set in subclasses to change the policy.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000259
Georg Brandl116aa622007-08-15 14:28:22 +0000260
Martin Pantereac17b82016-02-19 03:27:46 +0000261 .. attribute:: request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000262
Martin Pantereac17b82016-02-19 03:27:46 +0000263 The size of the request queue. If it takes a long time to process a single
264 request, any requests that arrive while the server is busy are placed into a
265 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
266 further requests from clients will get a "Connection denied" error. The default
267 value is usually 5, but this can be overridden by subclasses.
Georg Brandl116aa622007-08-15 14:28:22 +0000268
Georg Brandl116aa622007-08-15 14:28:22 +0000269
Martin Pantereac17b82016-02-19 03:27:46 +0000270 .. attribute:: socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000271
Martin Pantereac17b82016-02-19 03:27:46 +0000272 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
273 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000274
Georg Brandl116aa622007-08-15 14:28:22 +0000275
Martin Pantereac17b82016-02-19 03:27:46 +0000276 .. attribute:: timeout
Georg Brandl116aa622007-08-15 14:28:22 +0000277
Martin Pantereac17b82016-02-19 03:27:46 +0000278 Timeout duration, measured in seconds, or :const:`None` if no timeout is
279 desired. If :meth:`handle_request` receives no incoming requests within the
280 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandl116aa622007-08-15 14:28:22 +0000281
Georg Brandl116aa622007-08-15 14:28:22 +0000282
Martin Pantereac17b82016-02-19 03:27:46 +0000283 There are various server methods that can be overridden by subclasses of base
284 server classes like :class:`TCPServer`; these methods aren't useful to external
285 users of the server object.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000286
Martin Pantereac17b82016-02-19 03:27:46 +0000287 .. XXX should the default implementations of these be documented, or should
288 it be assumed that the user will look at socketserver.py?
Georg Brandlfceab5a2008-01-19 20:08:23 +0000289
Martin Pantereac17b82016-02-19 03:27:46 +0000290 .. method:: finish_request()
Georg Brandlfceab5a2008-01-19 20:08:23 +0000291
Martin Pantereac17b82016-02-19 03:27:46 +0000292 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
293 calling its :meth:`~BaseRequestHandler.handle` method.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000294
Georg Brandl116aa622007-08-15 14:28:22 +0000295
Martin Pantereac17b82016-02-19 03:27:46 +0000296 .. method:: get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000297
Martin Pantereac17b82016-02-19 03:27:46 +0000298 Must accept a request from the socket, and return a 2-tuple containing the *new*
299 socket object to be used to communicate with the client, and the client's
300 address.
Georg Brandl116aa622007-08-15 14:28:22 +0000301
Georg Brandl116aa622007-08-15 14:28:22 +0000302
Martin Pantereac17b82016-02-19 03:27:46 +0000303 .. method:: handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000304
Martin Pantereac17b82016-02-19 03:27:46 +0000305 This function is called if the :meth:`~BaseRequestHandler.handle`
306 method of a :attr:`RequestHandlerClass` instance raises
307 an exception. The default action is to print the traceback to
Martin Panterd9108d12016-02-21 08:49:56 +0000308 standard error and continue handling further requests.
309
310 .. versionchanged:: 3.6
311 Now only called for exceptions derived from the :exc:`Exception`
312 class.
Georg Brandl116aa622007-08-15 14:28:22 +0000313
Georg Brandl116aa622007-08-15 14:28:22 +0000314
Martin Pantereac17b82016-02-19 03:27:46 +0000315 .. method:: handle_timeout()
Georg Brandl116aa622007-08-15 14:28:22 +0000316
Martin Pantereac17b82016-02-19 03:27:46 +0000317 This function is called when the :attr:`timeout` attribute has been set to a
318 value other than :const:`None` and the timeout period has passed with no
319 requests being received. The default action for forking servers is
320 to collect the status of any child processes that have exited, while
321 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000322
Georg Brandl116aa622007-08-15 14:28:22 +0000323
Martin Pantereac17b82016-02-19 03:27:46 +0000324 .. method:: process_request(request, client_address)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000325
Martin Pantereac17b82016-02-19 03:27:46 +0000326 Calls :meth:`finish_request` to create an instance of the
327 :attr:`RequestHandlerClass`. If desired, this function can create a new process
328 or thread to handle the request; the :class:`ForkingMixIn` and
329 :class:`ThreadingMixIn` classes do this.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000330
Georg Brandl116aa622007-08-15 14:28:22 +0000331
Martin Pantereac17b82016-02-19 03:27:46 +0000332 .. Is there any point in documenting the following two functions?
333 What would the purpose of overriding them be: initializing server
334 instance variables, adding new network families?
Benjamin Petersond23f8222009-04-05 19:13:16 +0000335
Martin Pantereac17b82016-02-19 03:27:46 +0000336 .. method:: server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000337
Martin Pantereac17b82016-02-19 03:27:46 +0000338 Called by the server's constructor to activate the server. The default behavior
339 for a TCP server just invokes :meth:`~socket.socket.listen`
340 on the server's socket. May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000341
Benjamin Petersond23f8222009-04-05 19:13:16 +0000342
Martin Pantereac17b82016-02-19 03:27:46 +0000343 .. method:: server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000344
Martin Pantereac17b82016-02-19 03:27:46 +0000345 Called by the server's constructor to bind the socket to the desired address.
346 May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000347
Georg Brandl116aa622007-08-15 14:28:22 +0000348
Martin Pantereac17b82016-02-19 03:27:46 +0000349 .. method:: verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000350
Martin Pantereac17b82016-02-19 03:27:46 +0000351 Must return a Boolean value; if the value is :const:`True`, the request will
352 be processed, and if it's :const:`False`, the request will be denied. This
353 function can be overridden to implement access controls for a server. The
354 default implementation always returns :const:`True`.
Georg Brandl116aa622007-08-15 14:28:22 +0000355
Georg Brandl116aa622007-08-15 14:28:22 +0000356
Martin Panter0cab9c12016-04-13 00:36:52 +0000357 .. versionchanged:: 3.6
358 Support for the :term:`context manager` protocol was added. Exiting the
359 context manager is equivalent to calling :meth:`server_close`.
360
361
Martin Pantereac17b82016-02-19 03:27:46 +0000362Request Handler Objects
363-----------------------
Georg Brandl116aa622007-08-15 14:28:22 +0000364
Martin Pantereac17b82016-02-19 03:27:46 +0000365.. class:: BaseRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000366
Martin Pantereac17b82016-02-19 03:27:46 +0000367 This is the superclass of all request handler objects. It defines
368 the interface, given below. A concrete request handler subclass must
369 define a new :meth:`handle` method, and can override any of
370 the other methods. A new instance of the subclass is created for each
371 request.
Georg Brandl116aa622007-08-15 14:28:22 +0000372
373
Martin Pantereac17b82016-02-19 03:27:46 +0000374 .. method:: setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000375
Martin Pantereac17b82016-02-19 03:27:46 +0000376 Called before the :meth:`handle` method to perform any initialization actions
377 required. The default implementation does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000378
379
Martin Pantereac17b82016-02-19 03:27:46 +0000380 .. method:: handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000381
Martin Pantereac17b82016-02-19 03:27:46 +0000382 This function must do all the work required to service a request. The
383 default implementation does nothing. Several instance attributes are
384 available to it; the request is available as :attr:`self.request`; the client
385 address as :attr:`self.client_address`; and the server instance as
386 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000387
Martin Pantereac17b82016-02-19 03:27:46 +0000388 The type of :attr:`self.request` is different for datagram or stream
389 services. For stream services, :attr:`self.request` is a socket object; for
390 datagram services, :attr:`self.request` is a pair of string and socket.
Georg Brandl116aa622007-08-15 14:28:22 +0000391
Georg Brandl116aa622007-08-15 14:28:22 +0000392
Martin Pantereac17b82016-02-19 03:27:46 +0000393 .. method:: finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000394
Martin Pantereac17b82016-02-19 03:27:46 +0000395 Called after the :meth:`handle` method to perform any clean-up actions
396 required. The default implementation does nothing. If :meth:`setup`
397 raises an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000398
399
Martin Pantereac17b82016-02-19 03:27:46 +0000400.. class:: StreamRequestHandler
401 DatagramRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000402
Martin Pantereac17b82016-02-19 03:27:46 +0000403 These :class:`BaseRequestHandler` subclasses override the
404 :meth:`~BaseRequestHandler.setup` and :meth:`~BaseRequestHandler.finish`
405 methods, and provide :attr:`self.rfile` and :attr:`self.wfile` attributes.
406 The :attr:`self.rfile` and :attr:`self.wfile` attributes can be
407 read or written, respectively, to get the request data or return data
408 to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000409
Georg Brandlb533e262008-05-25 18:19:30 +0000410
411Examples
412--------
413
414:class:`socketserver.TCPServer` Example
415~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
416
417This is the server side::
418
419 import socketserver
420
421 class MyTCPHandler(socketserver.BaseRequestHandler):
422 """
Martin Pantereac17b82016-02-19 03:27:46 +0000423 The request handler class for our server.
Georg Brandlb533e262008-05-25 18:19:30 +0000424
425 It is instantiated once per connection to the server, and must
426 override the handle() method to implement communication to the
427 client.
428 """
429
430 def handle(self):
431 # self.request is the TCP socket connected to the client
432 self.data = self.request.recv(1024).strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200433 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000434 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000435 # just send back the same data, but upper-cased
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800436 self.request.sendall(self.data.upper())
Georg Brandlb533e262008-05-25 18:19:30 +0000437
438 if __name__ == "__main__":
439 HOST, PORT = "localhost", 9999
440
441 # Create the server, binding to localhost on port 9999
Martin Panter0cab9c12016-04-13 00:36:52 +0000442 with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
443 # Activate the server; this will keep running until you
444 # interrupt the program with Ctrl-C
445 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000446
447An alternative request handler class that makes use of streams (file-like
448objects that simplify communication by providing the standard file interface)::
449
450 class MyTCPHandler(socketserver.StreamRequestHandler):
451
452 def handle(self):
453 # self.rfile is a file-like object created by the handler;
454 # we can now use e.g. readline() instead of raw recv() calls
455 self.data = self.rfile.readline().strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200456 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000457 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000458 # Likewise, self.wfile is a file-like object used to write back
459 # to the client
460 self.wfile.write(self.data.upper())
461
462The difference is that the ``readline()`` call in the second handler will call
463``recv()`` multiple times until it encounters a newline character, while the
464single ``recv()`` call in the first handler will just return what has been sent
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800465from the client in one ``sendall()`` call.
Georg Brandlb533e262008-05-25 18:19:30 +0000466
467
468This is the client side::
469
470 import socket
471 import sys
472
473 HOST, PORT = "localhost", 9999
474 data = " ".join(sys.argv[1:])
475
476 # Create a socket (SOCK_STREAM means a TCP socket)
477 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
478
Florent Xicluna023611f2011-10-23 22:40:37 +0200479 try:
480 # 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")
486 finally:
487 sock.close()
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
492
493The output of the example should look something like this:
494
495Server::
496
497 $ python TCPServer.py
498 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000499 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000500 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000501 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000502
503Client::
504
505 $ python TCPClient.py hello world with TCP
506 Sent: hello world with TCP
Florent Xicluna023611f2011-10-23 22:40:37 +0200507 Received: HELLO WORLD WITH TCP
Georg Brandlb533e262008-05-25 18:19:30 +0000508 $ python TCPClient.py python is nice
509 Sent: python is nice
Florent Xicluna023611f2011-10-23 22:40:37 +0200510 Received: PYTHON IS NICE
Georg Brandlb533e262008-05-25 18:19:30 +0000511
512
513:class:`socketserver.UDPServer` Example
514~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
515
516This is the server side::
517
518 import socketserver
519
520 class MyUDPHandler(socketserver.BaseRequestHandler):
521 """
522 This class works similar to the TCP handler class, except that
523 self.request consists of a pair of data and client socket, and since
524 there is no connection the client address must be given explicitly
525 when sending data back via sendto().
526 """
527
528 def handle(self):
529 data = self.request[0].strip()
530 socket = self.request[1]
Florent Xicluna023611f2011-10-23 22:40:37 +0200531 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000532 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000533 socket.sendto(data.upper(), self.client_address)
534
535 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000536 HOST, PORT = "localhost", 9999
Martin Panter0cab9c12016-04-13 00:36:52 +0000537 with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
538 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000539
540This is the client side::
541
542 import socket
543 import sys
544
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000545 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000546 data = " ".join(sys.argv[1:])
547
548 # SOCK_DGRAM is the socket type to use for UDP sockets
549 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
550
551 # As you can see, there is no connect() call; UDP has no connections.
552 # Instead, data is directly sent to the recipient via sendto().
Florent Xicluna023611f2011-10-23 22:40:37 +0200553 sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
554 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000555
Florent Xicluna023611f2011-10-23 22:40:37 +0200556 print("Sent: {}".format(data))
557 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000558
559The output of the example should look exactly like for the TCP server example.
560
561
562Asynchronous Mixins
563~~~~~~~~~~~~~~~~~~~
564
565To build asynchronous handlers, use the :class:`ThreadingMixIn` and
566:class:`ForkingMixIn` classes.
567
568An example for the :class:`ThreadingMixIn` class::
569
570 import socket
571 import threading
572 import socketserver
573
574 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
575
576 def handle(self):
Florent Xicluna023611f2011-10-23 22:40:37 +0200577 data = str(self.request.recv(1024), 'ascii')
Georg Brandlf9926402008-06-13 06:32:25 +0000578 cur_thread = threading.current_thread()
Florent Xicluna023611f2011-10-23 22:40:37 +0200579 response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800580 self.request.sendall(response)
Georg Brandlb533e262008-05-25 18:19:30 +0000581
582 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
583 pass
584
585 def client(ip, port, message):
586 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
587 sock.connect((ip, port))
Florent Xicluna023611f2011-10-23 22:40:37 +0200588 try:
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800589 sock.sendall(bytes(message, 'ascii'))
Florent Xicluna023611f2011-10-23 22:40:37 +0200590 response = str(sock.recv(1024), 'ascii')
591 print("Received: {}".format(response))
592 finally:
593 sock.close()
Georg Brandlb533e262008-05-25 18:19:30 +0000594
595 if __name__ == "__main__":
596 # Port 0 means to select an arbitrary unused port
597 HOST, PORT = "localhost", 0
598
599 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
Martin Panter0cab9c12016-04-13 00:36:52 +0000600 with server:
601 ip, port = server.server_address
Georg Brandlb533e262008-05-25 18:19:30 +0000602
Martin Panter0cab9c12016-04-13 00:36:52 +0000603 # Start a thread with the server -- that thread will then start one
604 # more thread for each request
605 server_thread = threading.Thread(target=server.serve_forever)
606 # Exit the server thread when the main thread terminates
607 server_thread.daemon = True
608 server_thread.start()
609 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000610
Martin Panter0cab9c12016-04-13 00:36:52 +0000611 client(ip, port, "Hello World 1")
612 client(ip, port, "Hello World 2")
613 client(ip, port, "Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000614
Martin Panter0cab9c12016-04-13 00:36:52 +0000615 server.shutdown()
Georg Brandlb533e262008-05-25 18:19:30 +0000616
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000617
Georg Brandlb533e262008-05-25 18:19:30 +0000618The output of the example should look something like this::
619
620 $ python ThreadedTCPServer.py
621 Server loop running in thread: Thread-1
Florent Xicluna023611f2011-10-23 22:40:37 +0200622 Received: Thread-2: Hello World 1
623 Received: Thread-3: Hello World 2
624 Received: Thread-4: Hello World 3
Georg Brandlb533e262008-05-25 18:19:30 +0000625
626
627The :class:`ForkingMixIn` class is used in the same way, except that the server
628will spawn a new process for each request.