blob: 5600027383754dd1afad6f5e6bc783aebaa99d88 [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
Victor Stinnerdb8189b2018-01-29 12:10:22 +0100118 :meth:`socketserver.ForkingMixIn.server_close` waits until all child
119 processes complete.
120
121 :meth:`socketserver.ThreadingMixIn.server_close` waits until all non-daemon
122 threads complete. Use daemonic threads by setting
123 :data:`ThreadingMixIn.daemon_threads` to ``True`` to not wait until threads
124 complete.
125
126 .. versionchanged:: 3.7
127
128 :meth:`socketserver.ForkingMixIn.server_close` and
129 :meth:`socketserver.ThreadingMixIn.server_close` now waits until all
130 child processes and non-daemonic threads complete.
131
132
Martin Pantereac17b82016-02-19 03:27:46 +0000133.. class:: ForkingTCPServer
134 ForkingUDPServer
135 ThreadingTCPServer
136 ThreadingUDPServer
137
138 These classes are pre-defined using the mix-in classes.
139
Georg Brandl116aa622007-08-15 14:28:22 +0000140
141To implement a service, you must derive a class from :class:`BaseRequestHandler`
Martin Pantereac17b82016-02-19 03:27:46 +0000142and redefine its :meth:`~BaseRequestHandler.handle` method.
143You can then run various versions of
Georg Brandl116aa622007-08-15 14:28:22 +0000144the service by combining one of the server classes with your request handler
145class. The request handler class must be different for datagram or stream
146services. This can be hidden by using the handler subclasses
147:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
148
149Of course, you still have to use your head! For instance, it makes no sense to
150use a forking server if the service contains state in memory that can be
151modified by different requests, since the modifications in the child process
152would never reach the initial state kept in the parent process and passed to
153each child. In this case, you can use a threading server, but you will probably
154have to use locks to protect the integrity of the shared data.
155
156On the other hand, if you are building an HTTP server where all data is stored
157externally (for instance, in the file system), a synchronous class will
158essentially render the service "deaf" while one request is being handled --
159which may be for a very long time if a client is slow to receive all the data it
160has requested. Here a threading or forking server is appropriate.
161
162In some cases, it may be appropriate to process part of a request synchronously,
163but to finish processing in a forked child depending on the request data. This
164can be implemented by using a synchronous server and doing an explicit fork in
Martin Pantereac17b82016-02-19 03:27:46 +0000165the request handler class :meth:`~BaseRequestHandler.handle` method.
Georg Brandl116aa622007-08-15 14:28:22 +0000166
167Another approach to handling multiple simultaneous requests in an environment
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300168that supports neither threads nor :func:`~os.fork` (or where these are too
169expensive or inappropriate for the service) is to maintain an explicit table of
Charles-François Natali1d29cc52014-03-24 22:25:39 +0000170partially finished requests and to use :mod:`selectors` to decide which
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300171request to work on next (or whether to handle a new incoming request). This is
172particularly important for stream services where each client can potentially be
173connected for a long time (if threads or subprocesses cannot be used). See
174:mod:`asyncore` for another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000175
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000176.. XXX should data and methods be intermingled, or separate?
177 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000178
179
180Server Objects
181--------------
182
Martin Pantereac17b82016-02-19 03:27:46 +0000183.. class:: BaseServer(server_address, RequestHandlerClass)
Georg Brandl116aa622007-08-15 14:28:22 +0000184
Benjamin Petersond23f8222009-04-05 19:13:16 +0000185 This is the superclass of all Server objects in the module. It defines the
186 interface, given below, but does not implement most of the methods, which is
Martin Pantereac17b82016-02-19 03:27:46 +0000187 done in subclasses. The two parameters are stored in the respective
188 :attr:`server_address` and :attr:`RequestHandlerClass` attributes.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000189
190
Martin Pantereac17b82016-02-19 03:27:46 +0000191 .. method:: fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000192
Martin Pantereac17b82016-02-19 03:27:46 +0000193 Return an integer file descriptor for the socket on which the server is
194 listening. This function is most commonly passed to :mod:`selectors`, to
195 allow monitoring multiple servers in the same process.
Georg Brandl116aa622007-08-15 14:28:22 +0000196
197
Martin Pantereac17b82016-02-19 03:27:46 +0000198 .. method:: handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000199
Martin Pantereac17b82016-02-19 03:27:46 +0000200 Process a single request. This function calls the following methods in
201 order: :meth:`get_request`, :meth:`verify_request`, and
202 :meth:`process_request`. If the user-provided
203 :meth:`~BaseRequestHandler.handle` method of the
204 handler class raises an exception, the server's :meth:`handle_error` method
205 will be called. If no request is received within :attr:`timeout`
206 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
207 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000208
209
Martin Pantereac17b82016-02-19 03:27:46 +0000210 .. method:: serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000211
Martin Pantereac17b82016-02-19 03:27:46 +0000212 Handle requests until an explicit :meth:`shutdown` request. Poll for
213 shutdown every *poll_interval* seconds.
214 Ignores the :attr:`timeout` attribute. It
215 also calls :meth:`service_actions`, which may be used by a subclass or mixin
216 to provide actions specific to a given service. For example, the
217 :class:`ForkingMixIn` class uses :meth:`service_actions` to clean up zombie
218 child processes.
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000219
Martin Pantereac17b82016-02-19 03:27:46 +0000220 .. versionchanged:: 3.3
221 Added ``service_actions`` call to the ``serve_forever`` method.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800222
223
Martin Pantereac17b82016-02-19 03:27:46 +0000224 .. method:: service_actions()
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800225
Martin Pantereac17b82016-02-19 03:27:46 +0000226 This is called in the :meth:`serve_forever` loop. This method can be
227 overridden by subclasses or mixin classes to perform actions specific to
228 a given service, such as cleanup actions.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800229
Martin Pantereac17b82016-02-19 03:27:46 +0000230 .. versionadded:: 3.3
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000231
Martin Pantereac17b82016-02-19 03:27:46 +0000232 .. method:: shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000233
Martin Pantereac17b82016-02-19 03:27:46 +0000234 Tell the :meth:`serve_forever` loop to stop and wait until it does.
Georg Brandl116aa622007-08-15 14:28:22 +0000235
236
Martin Pantereac17b82016-02-19 03:27:46 +0000237 .. method:: server_close()
Robert Collins1ee92832015-07-29 12:52:40 +1200238
Martin Pantereac17b82016-02-19 03:27:46 +0000239 Clean up the server. May be overridden.
240
241
242 .. attribute:: address_family
243
244 The family of protocols to which the server's socket belongs.
245 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Robert Collins1ee92832015-07-29 12:52:40 +1200246
Robert Collins1ee92832015-07-29 12:52:40 +1200247
Martin Pantereac17b82016-02-19 03:27:46 +0000248 .. attribute:: RequestHandlerClass
Robert Collins1ee92832015-07-29 12:52:40 +1200249
Martin Pantereac17b82016-02-19 03:27:46 +0000250 The user-provided request handler class; an instance of this class is created
251 for each request.
Georg Brandl116aa622007-08-15 14:28:22 +0000252
Georg Brandl116aa622007-08-15 14:28:22 +0000253
Martin Pantereac17b82016-02-19 03:27:46 +0000254 .. attribute:: server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000255
Martin Pantereac17b82016-02-19 03:27:46 +0000256 The address on which the server is listening. The format of addresses varies
257 depending on the protocol family;
258 see the documentation for the :mod:`socket` module
259 for details. For Internet protocols, this is a tuple containing a string giving
260 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
Georg Brandl116aa622007-08-15 14:28:22 +0000261
Georg Brandl116aa622007-08-15 14:28:22 +0000262
Martin Pantereac17b82016-02-19 03:27:46 +0000263 .. attribute:: socket
Georg Brandl116aa622007-08-15 14:28:22 +0000264
Martin Pantereac17b82016-02-19 03:27:46 +0000265 The socket object on which the server will listen for incoming requests.
Georg Brandl116aa622007-08-15 14:28:22 +0000266
Georg Brandl116aa622007-08-15 14:28:22 +0000267
Martin Pantereac17b82016-02-19 03:27:46 +0000268 The server classes support the following class variables:
Georg Brandl116aa622007-08-15 14:28:22 +0000269
Martin Pantereac17b82016-02-19 03:27:46 +0000270 .. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000271
Martin Pantereac17b82016-02-19 03:27:46 +0000272 .. attribute:: allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000273
Martin Pantereac17b82016-02-19 03:27:46 +0000274 Whether the server will allow the reuse of an address. This defaults to
275 :const:`False`, and can be set in subclasses to change the policy.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000276
Georg Brandl116aa622007-08-15 14:28:22 +0000277
Martin Pantereac17b82016-02-19 03:27:46 +0000278 .. attribute:: request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000279
Martin Pantereac17b82016-02-19 03:27:46 +0000280 The size of the request queue. If it takes a long time to process a single
281 request, any requests that arrive while the server is busy are placed into a
282 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
283 further requests from clients will get a "Connection denied" error. The default
284 value is usually 5, but this can be overridden by subclasses.
Georg Brandl116aa622007-08-15 14:28:22 +0000285
Georg Brandl116aa622007-08-15 14:28:22 +0000286
Martin Pantereac17b82016-02-19 03:27:46 +0000287 .. attribute:: socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000288
Martin Pantereac17b82016-02-19 03:27:46 +0000289 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
290 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000291
Georg Brandl116aa622007-08-15 14:28:22 +0000292
Martin Pantereac17b82016-02-19 03:27:46 +0000293 .. attribute:: timeout
Georg Brandl116aa622007-08-15 14:28:22 +0000294
Martin Pantereac17b82016-02-19 03:27:46 +0000295 Timeout duration, measured in seconds, or :const:`None` if no timeout is
296 desired. If :meth:`handle_request` receives no incoming requests within the
297 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandl116aa622007-08-15 14:28:22 +0000298
Georg Brandl116aa622007-08-15 14:28:22 +0000299
Martin Pantereac17b82016-02-19 03:27:46 +0000300 There are various server methods that can be overridden by subclasses of base
301 server classes like :class:`TCPServer`; these methods aren't useful to external
302 users of the server object.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000303
Martin Pantereac17b82016-02-19 03:27:46 +0000304 .. XXX should the default implementations of these be documented, or should
305 it be assumed that the user will look at socketserver.py?
Georg Brandlfceab5a2008-01-19 20:08:23 +0000306
Masayuki Yamamoto7750bde2017-11-19 16:33:37 +0900307 .. method:: finish_request(request, client_address)
Georg Brandlfceab5a2008-01-19 20:08:23 +0000308
Martin Pantereac17b82016-02-19 03:27:46 +0000309 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
310 calling its :meth:`~BaseRequestHandler.handle` method.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000311
Georg Brandl116aa622007-08-15 14:28:22 +0000312
Martin Pantereac17b82016-02-19 03:27:46 +0000313 .. method:: get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000314
Martin Pantereac17b82016-02-19 03:27:46 +0000315 Must accept a request from the socket, and return a 2-tuple containing the *new*
316 socket object to be used to communicate with the client, and the client's
317 address.
Georg Brandl116aa622007-08-15 14:28:22 +0000318
Georg Brandl116aa622007-08-15 14:28:22 +0000319
Martin Pantereac17b82016-02-19 03:27:46 +0000320 .. method:: handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000321
Martin Pantereac17b82016-02-19 03:27:46 +0000322 This function is called if the :meth:`~BaseRequestHandler.handle`
323 method of a :attr:`RequestHandlerClass` instance raises
324 an exception. The default action is to print the traceback to
Martin Panterd9108d12016-02-21 08:49:56 +0000325 standard error and continue handling further requests.
326
327 .. versionchanged:: 3.6
328 Now only called for exceptions derived from the :exc:`Exception`
329 class.
Georg Brandl116aa622007-08-15 14:28:22 +0000330
Georg Brandl116aa622007-08-15 14:28:22 +0000331
Martin Pantereac17b82016-02-19 03:27:46 +0000332 .. method:: handle_timeout()
Georg Brandl116aa622007-08-15 14:28:22 +0000333
Martin Pantereac17b82016-02-19 03:27:46 +0000334 This function is called when the :attr:`timeout` attribute has been set to a
335 value other than :const:`None` and the timeout period has passed with no
336 requests being received. The default action for forking servers is
337 to collect the status of any child processes that have exited, while
338 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000339
Georg Brandl116aa622007-08-15 14:28:22 +0000340
Martin Pantereac17b82016-02-19 03:27:46 +0000341 .. method:: process_request(request, client_address)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000342
Martin Pantereac17b82016-02-19 03:27:46 +0000343 Calls :meth:`finish_request` to create an instance of the
344 :attr:`RequestHandlerClass`. If desired, this function can create a new process
345 or thread to handle the request; the :class:`ForkingMixIn` and
346 :class:`ThreadingMixIn` classes do this.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000347
Georg Brandl116aa622007-08-15 14:28:22 +0000348
Martin Pantereac17b82016-02-19 03:27:46 +0000349 .. Is there any point in documenting the following two functions?
350 What would the purpose of overriding them be: initializing server
351 instance variables, adding new network families?
Benjamin Petersond23f8222009-04-05 19:13:16 +0000352
Martin Pantereac17b82016-02-19 03:27:46 +0000353 .. method:: server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000354
Martin Pantereac17b82016-02-19 03:27:46 +0000355 Called by the server's constructor to activate the server. The default behavior
356 for a TCP server just invokes :meth:`~socket.socket.listen`
357 on the server's socket. May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000358
Benjamin Petersond23f8222009-04-05 19:13:16 +0000359
Martin Pantereac17b82016-02-19 03:27:46 +0000360 .. method:: server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000361
Martin Pantereac17b82016-02-19 03:27:46 +0000362 Called by the server's constructor to bind the socket to the desired address.
363 May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000364
Georg Brandl116aa622007-08-15 14:28:22 +0000365
Martin Pantereac17b82016-02-19 03:27:46 +0000366 .. method:: verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000367
Martin Pantereac17b82016-02-19 03:27:46 +0000368 Must return a Boolean value; if the value is :const:`True`, the request will
369 be processed, and if it's :const:`False`, the request will be denied. This
370 function can be overridden to implement access controls for a server. The
371 default implementation always returns :const:`True`.
Georg Brandl116aa622007-08-15 14:28:22 +0000372
Georg Brandl116aa622007-08-15 14:28:22 +0000373
Martin Panter0cab9c12016-04-13 00:36:52 +0000374 .. versionchanged:: 3.6
375 Support for the :term:`context manager` protocol was added. Exiting the
376 context manager is equivalent to calling :meth:`server_close`.
377
378
Martin Pantereac17b82016-02-19 03:27:46 +0000379Request Handler Objects
380-----------------------
Georg Brandl116aa622007-08-15 14:28:22 +0000381
Martin Pantereac17b82016-02-19 03:27:46 +0000382.. class:: BaseRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000383
Martin Pantereac17b82016-02-19 03:27:46 +0000384 This is the superclass of all request handler objects. It defines
385 the interface, given below. A concrete request handler subclass must
386 define a new :meth:`handle` method, and can override any of
387 the other methods. A new instance of the subclass is created for each
388 request.
Georg Brandl116aa622007-08-15 14:28:22 +0000389
390
Martin Pantereac17b82016-02-19 03:27:46 +0000391 .. method:: setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000392
Martin Pantereac17b82016-02-19 03:27:46 +0000393 Called before the :meth:`handle` method to perform any initialization actions
394 required. The default implementation does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000395
396
Martin Pantereac17b82016-02-19 03:27:46 +0000397 .. method:: handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000398
Martin Pantereac17b82016-02-19 03:27:46 +0000399 This function must do all the work required to service a request. The
400 default implementation does nothing. Several instance attributes are
401 available to it; the request is available as :attr:`self.request`; the client
402 address as :attr:`self.client_address`; and the server instance as
403 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000404
Martin Pantereac17b82016-02-19 03:27:46 +0000405 The type of :attr:`self.request` is different for datagram or stream
406 services. For stream services, :attr:`self.request` is a socket object; for
407 datagram services, :attr:`self.request` is a pair of string and socket.
Georg Brandl116aa622007-08-15 14:28:22 +0000408
Georg Brandl116aa622007-08-15 14:28:22 +0000409
Martin Pantereac17b82016-02-19 03:27:46 +0000410 .. method:: finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000411
Martin Pantereac17b82016-02-19 03:27:46 +0000412 Called after the :meth:`handle` method to perform any clean-up actions
413 required. The default implementation does nothing. If :meth:`setup`
414 raises an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000415
416
Martin Pantereac17b82016-02-19 03:27:46 +0000417.. class:: StreamRequestHandler
418 DatagramRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000419
Martin Pantereac17b82016-02-19 03:27:46 +0000420 These :class:`BaseRequestHandler` subclasses override the
421 :meth:`~BaseRequestHandler.setup` and :meth:`~BaseRequestHandler.finish`
422 methods, and provide :attr:`self.rfile` and :attr:`self.wfile` attributes.
423 The :attr:`self.rfile` and :attr:`self.wfile` attributes can be
424 read or written, respectively, to get the request data or return data
425 to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000426
Martin Panter34eeed42016-06-29 10:12:22 +0000427 The :attr:`rfile` attributes of both classes support the
428 :class:`io.BufferedIOBase` readable interface, and
429 :attr:`DatagramRequestHandler.wfile` supports the
430 :class:`io.BufferedIOBase` writable interface.
431
432 .. versionchanged:: 3.6
433 :attr:`StreamRequestHandler.wfile` also supports the
434 :class:`io.BufferedIOBase` writable interface.
435
Georg Brandlb533e262008-05-25 18:19:30 +0000436
437Examples
438--------
439
440:class:`socketserver.TCPServer` Example
441~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
442
443This is the server side::
444
445 import socketserver
446
447 class MyTCPHandler(socketserver.BaseRequestHandler):
448 """
Martin Pantereac17b82016-02-19 03:27:46 +0000449 The request handler class for our server.
Georg Brandlb533e262008-05-25 18:19:30 +0000450
451 It is instantiated once per connection to the server, and must
452 override the handle() method to implement communication to the
453 client.
454 """
455
456 def handle(self):
457 # self.request is the TCP socket connected to the client
458 self.data = self.request.recv(1024).strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200459 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000460 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000461 # just send back the same data, but upper-cased
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800462 self.request.sendall(self.data.upper())
Georg Brandlb533e262008-05-25 18:19:30 +0000463
464 if __name__ == "__main__":
465 HOST, PORT = "localhost", 9999
466
467 # Create the server, binding to localhost on port 9999
Martin Panter0cab9c12016-04-13 00:36:52 +0000468 with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
469 # Activate the server; this will keep running until you
470 # interrupt the program with Ctrl-C
471 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000472
473An alternative request handler class that makes use of streams (file-like
474objects that simplify communication by providing the standard file interface)::
475
476 class MyTCPHandler(socketserver.StreamRequestHandler):
477
478 def handle(self):
479 # self.rfile is a file-like object created by the handler;
480 # we can now use e.g. readline() instead of raw recv() calls
481 self.data = self.rfile.readline().strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200482 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000483 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000484 # Likewise, self.wfile is a file-like object used to write back
485 # to the client
486 self.wfile.write(self.data.upper())
487
488The difference is that the ``readline()`` call in the second handler will call
489``recv()`` multiple times until it encounters a newline character, while the
490single ``recv()`` call in the first handler will just return what has been sent
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800491from the client in one ``sendall()`` call.
Georg Brandlb533e262008-05-25 18:19:30 +0000492
493
494This is the client side::
495
496 import socket
497 import sys
498
499 HOST, PORT = "localhost", 9999
500 data = " ".join(sys.argv[1:])
501
502 # Create a socket (SOCK_STREAM means a TCP socket)
Martin Pantere37fc182016-04-24 04:24:36 +0000503 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
Florent Xicluna023611f2011-10-23 22:40:37 +0200504 # Connect to server and send data
505 sock.connect((HOST, PORT))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800506 sock.sendall(bytes(data + "\n", "utf-8"))
Georg Brandlb533e262008-05-25 18:19:30 +0000507
Florent Xicluna023611f2011-10-23 22:40:37 +0200508 # Receive data from the server and shut down
509 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000510
Florent Xicluna023611f2011-10-23 22:40:37 +0200511 print("Sent: {}".format(data))
512 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000513
514
515The output of the example should look something like this:
516
Martin Panter1050d2d2016-07-26 11:18:21 +0200517Server:
518
519.. code-block:: shell-session
Georg Brandlb533e262008-05-25 18:19:30 +0000520
521 $ python TCPServer.py
522 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000523 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000524 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000525 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000526
Martin Panter1050d2d2016-07-26 11:18:21 +0200527Client:
528
529.. code-block:: shell-session
Georg Brandlb533e262008-05-25 18:19:30 +0000530
531 $ python TCPClient.py hello world with TCP
532 Sent: hello world with TCP
Florent Xicluna023611f2011-10-23 22:40:37 +0200533 Received: HELLO WORLD WITH TCP
Georg Brandlb533e262008-05-25 18:19:30 +0000534 $ python TCPClient.py python is nice
535 Sent: python is nice
Florent Xicluna023611f2011-10-23 22:40:37 +0200536 Received: PYTHON IS NICE
Georg Brandlb533e262008-05-25 18:19:30 +0000537
538
539:class:`socketserver.UDPServer` Example
540~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
541
542This is the server side::
543
544 import socketserver
545
546 class MyUDPHandler(socketserver.BaseRequestHandler):
547 """
548 This class works similar to the TCP handler class, except that
549 self.request consists of a pair of data and client socket, and since
550 there is no connection the client address must be given explicitly
551 when sending data back via sendto().
552 """
553
554 def handle(self):
555 data = self.request[0].strip()
556 socket = self.request[1]
Florent Xicluna023611f2011-10-23 22:40:37 +0200557 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000558 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000559 socket.sendto(data.upper(), self.client_address)
560
561 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000562 HOST, PORT = "localhost", 9999
Martin Panter0cab9c12016-04-13 00:36:52 +0000563 with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
564 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000565
566This is the client side::
567
568 import socket
569 import sys
570
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000571 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000572 data = " ".join(sys.argv[1:])
573
574 # SOCK_DGRAM is the socket type to use for UDP sockets
575 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
576
577 # As you can see, there is no connect() call; UDP has no connections.
578 # Instead, data is directly sent to the recipient via sendto().
Florent Xicluna023611f2011-10-23 22:40:37 +0200579 sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
580 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000581
Florent Xicluna023611f2011-10-23 22:40:37 +0200582 print("Sent: {}".format(data))
583 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000584
585The output of the example should look exactly like for the TCP server example.
586
587
588Asynchronous Mixins
589~~~~~~~~~~~~~~~~~~~
590
591To build asynchronous handlers, use the :class:`ThreadingMixIn` and
592:class:`ForkingMixIn` classes.
593
594An example for the :class:`ThreadingMixIn` class::
595
596 import socket
597 import threading
598 import socketserver
599
600 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
601
602 def handle(self):
Florent Xicluna023611f2011-10-23 22:40:37 +0200603 data = str(self.request.recv(1024), 'ascii')
Georg Brandlf9926402008-06-13 06:32:25 +0000604 cur_thread = threading.current_thread()
Florent Xicluna023611f2011-10-23 22:40:37 +0200605 response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800606 self.request.sendall(response)
Georg Brandlb533e262008-05-25 18:19:30 +0000607
608 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
609 pass
610
611 def client(ip, port, message):
Martin Pantere37fc182016-04-24 04:24:36 +0000612 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
613 sock.connect((ip, port))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800614 sock.sendall(bytes(message, 'ascii'))
Florent Xicluna023611f2011-10-23 22:40:37 +0200615 response = str(sock.recv(1024), 'ascii')
616 print("Received: {}".format(response))
Georg Brandlb533e262008-05-25 18:19:30 +0000617
618 if __name__ == "__main__":
619 # Port 0 means to select an arbitrary unused port
620 HOST, PORT = "localhost", 0
621
622 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
Martin Panter0cab9c12016-04-13 00:36:52 +0000623 with server:
624 ip, port = server.server_address
Georg Brandlb533e262008-05-25 18:19:30 +0000625
Martin Panter0cab9c12016-04-13 00:36:52 +0000626 # Start a thread with the server -- that thread will then start one
627 # more thread for each request
628 server_thread = threading.Thread(target=server.serve_forever)
629 # Exit the server thread when the main thread terminates
630 server_thread.daemon = True
631 server_thread.start()
632 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000633
Martin Panter0cab9c12016-04-13 00:36:52 +0000634 client(ip, port, "Hello World 1")
635 client(ip, port, "Hello World 2")
636 client(ip, port, "Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000637
Martin Panter0cab9c12016-04-13 00:36:52 +0000638 server.shutdown()
Georg Brandlb533e262008-05-25 18:19:30 +0000639
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000640
Martin Panter1050d2d2016-07-26 11:18:21 +0200641The output of the example should look something like this:
642
643.. code-block:: shell-session
Georg Brandlb533e262008-05-25 18:19:30 +0000644
645 $ python ThreadedTCPServer.py
646 Server loop running in thread: Thread-1
Florent Xicluna023611f2011-10-23 22:40:37 +0200647 Received: Thread-2: Hello World 1
648 Received: Thread-3: Hello World 2
649 Received: Thread-4: Hello World 3
Georg Brandlb533e262008-05-25 18:19:30 +0000650
651
652The :class:`ForkingMixIn` class is used in the same way, except that the server
653will spawn a new process for each request.
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D)287e6872016-06-03 05:44:47 +0000654Available only on POSIX platforms that support :func:`~os.fork`.
655