blob: f0cfc80bf30dd2911b202c54ac47c76621efd37b [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
Robert Collins1ee92832015-07-29 12:52:40 +120055the server's address and the request handler class. Then call the
Martin Pantereac17b82016-02-19 03:27:46 +000056:meth:`~BaseServer.handle_request` or
57:meth:`~BaseServer.serve_forever` method of the server object to
Robert Collins1ee92832015-07-29 12:52:40 +120058process one or many requests. Finally, call :meth:`~BaseServer.server_close`
59to close the socket.
Georg Brandl116aa622007-08-15 14:28:22 +000060
61When inheriting from :class:`ThreadingMixIn` for threaded connection behavior,
62you should explicitly declare how you want your threads to behave on an abrupt
Florent Xicluna599d76b2011-11-11 19:56:26 +010063shutdown. The :class:`ThreadingMixIn` class defines an attribute
Georg Brandl116aa622007-08-15 14:28:22 +000064*daemon_threads*, which indicates whether or not the server should wait for
Florent Xicluna599d76b2011-11-11 19:56:26 +010065thread termination. You should set the flag explicitly if you would like
66threads to behave autonomously; the default is :const:`False`, meaning that
67Python will not exit until all threads created by :class:`ThreadingMixIn` have
68exited.
Georg Brandl116aa622007-08-15 14:28:22 +000069
70Server classes have the same external methods and attributes, no matter what
Georg Brandlfceab5a2008-01-19 20:08:23 +000071network protocol they use.
Georg Brandl116aa622007-08-15 14:28:22 +000072
73
74Server Creation Notes
75---------------------
76
77There are five classes in an inheritance diagram, four of which represent
78synchronous servers of four types::
79
80 +------------+
81 | BaseServer |
82 +------------+
83 |
84 v
85 +-----------+ +------------------+
86 | TCPServer |------->| UnixStreamServer |
87 +-----------+ +------------------+
88 |
89 v
90 +-----------+ +--------------------+
91 | UDPServer |------->| UnixDatagramServer |
92 +-----------+ +--------------------+
93
94Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from
95:class:`UnixStreamServer` --- the only difference between an IP and a Unix
96stream server is the address family, which is simply repeated in both Unix
97server classes.
98
Georg Brandl116aa622007-08-15 14:28:22 +000099
Martin Pantereac17b82016-02-19 03:27:46 +0000100.. class:: ForkingMixIn
101 ThreadingMixIn
Georg Brandl116aa622007-08-15 14:28:22 +0000102
Martin Pantereac17b82016-02-19 03:27:46 +0000103 Forking and threading versions of each type of server can be created
104 using these mix-in classes. For instance, :class:`ThreadingUDPServer`
105 is created as follows::
106
107 class ThreadingUDPServer(ThreadingMixIn, UDPServer):
108 pass
109
110 The mix-in class comes first, since it overrides a method defined in
111 :class:`UDPServer`. Setting the various attributes also changes the
112 behavior of the underlying server mechanism.
113
114
115.. class:: ForkingTCPServer
116 ForkingUDPServer
117 ThreadingTCPServer
118 ThreadingUDPServer
119
120 These classes are pre-defined using the mix-in classes.
121
Georg Brandl116aa622007-08-15 14:28:22 +0000122
123To implement a service, you must derive a class from :class:`BaseRequestHandler`
Martin Pantereac17b82016-02-19 03:27:46 +0000124and redefine its :meth:`~BaseRequestHandler.handle` method.
125You can then run various versions of
Georg Brandl116aa622007-08-15 14:28:22 +0000126the service by combining one of the server classes with your request handler
127class. The request handler class must be different for datagram or stream
128services. This can be hidden by using the handler subclasses
129:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
130
131Of course, you still have to use your head! For instance, it makes no sense to
132use a forking server if the service contains state in memory that can be
133modified by different requests, since the modifications in the child process
134would never reach the initial state kept in the parent process and passed to
135each child. In this case, you can use a threading server, but you will probably
136have to use locks to protect the integrity of the shared data.
137
138On the other hand, if you are building an HTTP server where all data is stored
139externally (for instance, in the file system), a synchronous class will
140essentially render the service "deaf" while one request is being handled --
141which may be for a very long time if a client is slow to receive all the data it
142has requested. Here a threading or forking server is appropriate.
143
144In some cases, it may be appropriate to process part of a request synchronously,
145but to finish processing in a forked child depending on the request data. This
146can be implemented by using a synchronous server and doing an explicit fork in
Martin Pantereac17b82016-02-19 03:27:46 +0000147the request handler class :meth:`~BaseRequestHandler.handle` method.
Georg Brandl116aa622007-08-15 14:28:22 +0000148
149Another approach to handling multiple simultaneous requests in an environment
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300150that supports neither threads nor :func:`~os.fork` (or where these are too
151expensive or inappropriate for the service) is to maintain an explicit table of
Charles-François Natali1d29cc52014-03-24 22:25:39 +0000152partially finished requests and to use :mod:`selectors` to decide which
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300153request to work on next (or whether to handle a new incoming request). This is
154particularly important for stream services where each client can potentially be
155connected for a long time (if threads or subprocesses cannot be used). See
156:mod:`asyncore` for another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000157
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000158.. XXX should data and methods be intermingled, or separate?
159 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000160
161
162Server Objects
163--------------
164
Martin Pantereac17b82016-02-19 03:27:46 +0000165.. class:: BaseServer(server_address, RequestHandlerClass)
Georg Brandl116aa622007-08-15 14:28:22 +0000166
Benjamin Petersond23f8222009-04-05 19:13:16 +0000167 This is the superclass of all Server objects in the module. It defines the
168 interface, given below, but does not implement most of the methods, which is
Martin Pantereac17b82016-02-19 03:27:46 +0000169 done in subclasses. The two parameters are stored in the respective
170 :attr:`server_address` and :attr:`RequestHandlerClass` attributes.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000171
172
Martin Pantereac17b82016-02-19 03:27:46 +0000173 .. method:: fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000174
Martin Pantereac17b82016-02-19 03:27:46 +0000175 Return an integer file descriptor for the socket on which the server is
176 listening. This function is most commonly passed to :mod:`selectors`, to
177 allow monitoring multiple servers in the same process.
Georg Brandl116aa622007-08-15 14:28:22 +0000178
179
Martin Pantereac17b82016-02-19 03:27:46 +0000180 .. method:: handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000181
Martin Pantereac17b82016-02-19 03:27:46 +0000182 Process a single request. This function calls the following methods in
183 order: :meth:`get_request`, :meth:`verify_request`, and
184 :meth:`process_request`. If the user-provided
185 :meth:`~BaseRequestHandler.handle` method of the
186 handler class raises an exception, the server's :meth:`handle_error` method
187 will be called. If no request is received within :attr:`timeout`
188 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
189 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000190
191
Martin Pantereac17b82016-02-19 03:27:46 +0000192 .. method:: serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000193
Martin Pantereac17b82016-02-19 03:27:46 +0000194 Handle requests until an explicit :meth:`shutdown` request. Poll for
195 shutdown every *poll_interval* seconds.
196 Ignores the :attr:`timeout` attribute. It
197 also calls :meth:`service_actions`, which may be used by a subclass or mixin
198 to provide actions specific to a given service. For example, the
199 :class:`ForkingMixIn` class uses :meth:`service_actions` to clean up zombie
200 child processes.
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000201
Martin Pantereac17b82016-02-19 03:27:46 +0000202 .. versionchanged:: 3.3
203 Added ``service_actions`` call to the ``serve_forever`` method.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800204
205
Martin Pantereac17b82016-02-19 03:27:46 +0000206 .. method:: service_actions()
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800207
Martin Pantereac17b82016-02-19 03:27:46 +0000208 This is called in the :meth:`serve_forever` loop. This method can be
209 overridden by subclasses or mixin classes to perform actions specific to
210 a given service, such as cleanup actions.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800211
Martin Pantereac17b82016-02-19 03:27:46 +0000212 .. versionadded:: 3.3
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000213
Martin Pantereac17b82016-02-19 03:27:46 +0000214 .. method:: shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000215
Martin Pantereac17b82016-02-19 03:27:46 +0000216 Tell the :meth:`serve_forever` loop to stop and wait until it does.
Georg Brandl116aa622007-08-15 14:28:22 +0000217
218
Martin Pantereac17b82016-02-19 03:27:46 +0000219 .. method:: server_close()
Robert Collins1ee92832015-07-29 12:52:40 +1200220
Martin Pantereac17b82016-02-19 03:27:46 +0000221 Clean up the server. May be overridden.
222
223
224 .. attribute:: address_family
225
226 The family of protocols to which the server's socket belongs.
227 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Robert Collins1ee92832015-07-29 12:52:40 +1200228
Robert Collins1ee92832015-07-29 12:52:40 +1200229
Martin Pantereac17b82016-02-19 03:27:46 +0000230 .. attribute:: RequestHandlerClass
Robert Collins1ee92832015-07-29 12:52:40 +1200231
Martin Pantereac17b82016-02-19 03:27:46 +0000232 The user-provided request handler class; an instance of this class is created
233 for each request.
Georg Brandl116aa622007-08-15 14:28:22 +0000234
Georg Brandl116aa622007-08-15 14:28:22 +0000235
Martin Pantereac17b82016-02-19 03:27:46 +0000236 .. attribute:: server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000237
Martin Pantereac17b82016-02-19 03:27:46 +0000238 The address on which the server is listening. The format of addresses varies
239 depending on the protocol family;
240 see the documentation for the :mod:`socket` module
241 for details. For Internet protocols, this is a tuple containing a string giving
242 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
Georg Brandl116aa622007-08-15 14:28:22 +0000243
Georg Brandl116aa622007-08-15 14:28:22 +0000244
Martin Pantereac17b82016-02-19 03:27:46 +0000245 .. attribute:: socket
Georg Brandl116aa622007-08-15 14:28:22 +0000246
Martin Pantereac17b82016-02-19 03:27:46 +0000247 The socket object on which the server will listen for incoming requests.
Georg Brandl116aa622007-08-15 14:28:22 +0000248
Georg Brandl116aa622007-08-15 14:28:22 +0000249
Martin Pantereac17b82016-02-19 03:27:46 +0000250 The server classes support the following class variables:
Georg Brandl116aa622007-08-15 14:28:22 +0000251
Martin Pantereac17b82016-02-19 03:27:46 +0000252 .. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000253
Martin Pantereac17b82016-02-19 03:27:46 +0000254 .. attribute:: allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000255
Martin Pantereac17b82016-02-19 03:27:46 +0000256 Whether the server will allow the reuse of an address. This defaults to
257 :const:`False`, and can be set in subclasses to change the policy.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000258
Georg Brandl116aa622007-08-15 14:28:22 +0000259
Martin Pantereac17b82016-02-19 03:27:46 +0000260 .. attribute:: request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000261
Martin Pantereac17b82016-02-19 03:27:46 +0000262 The size of the request queue. If it takes a long time to process a single
263 request, any requests that arrive while the server is busy are placed into a
264 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
265 further requests from clients will get a "Connection denied" error. The default
266 value is usually 5, but this can be overridden by subclasses.
Georg Brandl116aa622007-08-15 14:28:22 +0000267
Georg Brandl116aa622007-08-15 14:28:22 +0000268
Martin Pantereac17b82016-02-19 03:27:46 +0000269 .. attribute:: socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000270
Martin Pantereac17b82016-02-19 03:27:46 +0000271 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
272 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000273
Georg Brandl116aa622007-08-15 14:28:22 +0000274
Martin Pantereac17b82016-02-19 03:27:46 +0000275 .. attribute:: timeout
Georg Brandl116aa622007-08-15 14:28:22 +0000276
Martin Pantereac17b82016-02-19 03:27:46 +0000277 Timeout duration, measured in seconds, or :const:`None` if no timeout is
278 desired. If :meth:`handle_request` receives no incoming requests within the
279 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandl116aa622007-08-15 14:28:22 +0000280
Georg Brandl116aa622007-08-15 14:28:22 +0000281
Martin Pantereac17b82016-02-19 03:27:46 +0000282 There are various server methods that can be overridden by subclasses of base
283 server classes like :class:`TCPServer`; these methods aren't useful to external
284 users of the server object.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000285
Martin Pantereac17b82016-02-19 03:27:46 +0000286 .. XXX should the default implementations of these be documented, or should
287 it be assumed that the user will look at socketserver.py?
Georg Brandlfceab5a2008-01-19 20:08:23 +0000288
Martin Pantereac17b82016-02-19 03:27:46 +0000289 .. method:: finish_request()
Georg Brandlfceab5a2008-01-19 20:08:23 +0000290
Martin Pantereac17b82016-02-19 03:27:46 +0000291 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
292 calling its :meth:`~BaseRequestHandler.handle` method.
Benjamin Petersond23f8222009-04-05 19:13:16 +0000293
Georg Brandl116aa622007-08-15 14:28:22 +0000294
Martin Pantereac17b82016-02-19 03:27:46 +0000295 .. method:: get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000296
Martin Pantereac17b82016-02-19 03:27:46 +0000297 Must accept a request from the socket, and return a 2-tuple containing the *new*
298 socket object to be used to communicate with the client, and the client's
299 address.
Georg Brandl116aa622007-08-15 14:28:22 +0000300
Georg Brandl116aa622007-08-15 14:28:22 +0000301
Martin Pantereac17b82016-02-19 03:27:46 +0000302 .. method:: handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000303
Martin Pantereac17b82016-02-19 03:27:46 +0000304 This function is called if the :meth:`~BaseRequestHandler.handle`
305 method of a :attr:`RequestHandlerClass` instance raises
306 an exception. The default action is to print the traceback to
307 standard output and continue handling further requests.
Georg Brandl116aa622007-08-15 14:28:22 +0000308
Georg Brandl116aa622007-08-15 14:28:22 +0000309
Martin Pantereac17b82016-02-19 03:27:46 +0000310 .. method:: handle_timeout()
Georg Brandl116aa622007-08-15 14:28:22 +0000311
Martin Pantereac17b82016-02-19 03:27:46 +0000312 This function is called when the :attr:`timeout` attribute has been set to a
313 value other than :const:`None` and the timeout period has passed with no
314 requests being received. The default action for forking servers is
315 to collect the status of any child processes that have exited, while
316 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000317
Georg Brandl116aa622007-08-15 14:28:22 +0000318
Martin Pantereac17b82016-02-19 03:27:46 +0000319 .. method:: process_request(request, client_address)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000320
Martin Pantereac17b82016-02-19 03:27:46 +0000321 Calls :meth:`finish_request` to create an instance of the
322 :attr:`RequestHandlerClass`. If desired, this function can create a new process
323 or thread to handle the request; the :class:`ForkingMixIn` and
324 :class:`ThreadingMixIn` classes do this.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000325
Georg Brandl116aa622007-08-15 14:28:22 +0000326
Martin Pantereac17b82016-02-19 03:27:46 +0000327 .. Is there any point in documenting the following two functions?
328 What would the purpose of overriding them be: initializing server
329 instance variables, adding new network families?
Benjamin Petersond23f8222009-04-05 19:13:16 +0000330
Martin Pantereac17b82016-02-19 03:27:46 +0000331 .. method:: server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000332
Martin Pantereac17b82016-02-19 03:27:46 +0000333 Called by the server's constructor to activate the server. The default behavior
334 for a TCP server just invokes :meth:`~socket.socket.listen`
335 on the server's socket. May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000336
Benjamin Petersond23f8222009-04-05 19:13:16 +0000337
Martin Pantereac17b82016-02-19 03:27:46 +0000338 .. method:: server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000339
Martin Pantereac17b82016-02-19 03:27:46 +0000340 Called by the server's constructor to bind the socket to the desired address.
341 May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000342
Georg Brandl116aa622007-08-15 14:28:22 +0000343
Martin Pantereac17b82016-02-19 03:27:46 +0000344 .. method:: verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000345
Martin Pantereac17b82016-02-19 03:27:46 +0000346 Must return a Boolean value; if the value is :const:`True`, the request will
347 be processed, and if it's :const:`False`, the request will be denied. This
348 function can be overridden to implement access controls for a server. The
349 default implementation always returns :const:`True`.
Georg Brandl116aa622007-08-15 14:28:22 +0000350
Georg Brandl116aa622007-08-15 14:28:22 +0000351
Martin Pantereac17b82016-02-19 03:27:46 +0000352Request Handler Objects
353-----------------------
Georg Brandl116aa622007-08-15 14:28:22 +0000354
Martin Pantereac17b82016-02-19 03:27:46 +0000355.. class:: BaseRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000356
Martin Pantereac17b82016-02-19 03:27:46 +0000357 This is the superclass of all request handler objects. It defines
358 the interface, given below. A concrete request handler subclass must
359 define a new :meth:`handle` method, and can override any of
360 the other methods. A new instance of the subclass is created for each
361 request.
Georg Brandl116aa622007-08-15 14:28:22 +0000362
363
Martin Pantereac17b82016-02-19 03:27:46 +0000364 .. method:: setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000365
Martin Pantereac17b82016-02-19 03:27:46 +0000366 Called before the :meth:`handle` method to perform any initialization actions
367 required. The default implementation does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000368
369
Martin Pantereac17b82016-02-19 03:27:46 +0000370 .. method:: handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000371
Martin Pantereac17b82016-02-19 03:27:46 +0000372 This function must do all the work required to service a request. The
373 default implementation does nothing. Several instance attributes are
374 available to it; the request is available as :attr:`self.request`; the client
375 address as :attr:`self.client_address`; and the server instance as
376 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000377
Martin Pantereac17b82016-02-19 03:27:46 +0000378 The type of :attr:`self.request` is different for datagram or stream
379 services. For stream services, :attr:`self.request` is a socket object; for
380 datagram services, :attr:`self.request` is a pair of string and socket.
Georg Brandl116aa622007-08-15 14:28:22 +0000381
Georg Brandl116aa622007-08-15 14:28:22 +0000382
Martin Pantereac17b82016-02-19 03:27:46 +0000383 .. method:: finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000384
Martin Pantereac17b82016-02-19 03:27:46 +0000385 Called after the :meth:`handle` method to perform any clean-up actions
386 required. The default implementation does nothing. If :meth:`setup`
387 raises an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000388
389
Martin Pantereac17b82016-02-19 03:27:46 +0000390.. class:: StreamRequestHandler
391 DatagramRequestHandler
Georg Brandl116aa622007-08-15 14:28:22 +0000392
Martin Pantereac17b82016-02-19 03:27:46 +0000393 These :class:`BaseRequestHandler` subclasses override the
394 :meth:`~BaseRequestHandler.setup` and :meth:`~BaseRequestHandler.finish`
395 methods, and provide :attr:`self.rfile` and :attr:`self.wfile` attributes.
396 The :attr:`self.rfile` and :attr:`self.wfile` attributes can be
397 read or written, respectively, to get the request data or return data
398 to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000399
Georg Brandlb533e262008-05-25 18:19:30 +0000400
401Examples
402--------
403
404:class:`socketserver.TCPServer` Example
405~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
406
407This is the server side::
408
409 import socketserver
410
411 class MyTCPHandler(socketserver.BaseRequestHandler):
412 """
Martin Pantereac17b82016-02-19 03:27:46 +0000413 The request handler class for our server.
Georg Brandlb533e262008-05-25 18:19:30 +0000414
415 It is instantiated once per connection to the server, and must
416 override the handle() method to implement communication to the
417 client.
418 """
419
420 def handle(self):
421 # self.request is the TCP socket connected to the client
422 self.data = self.request.recv(1024).strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200423 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000424 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000425 # just send back the same data, but upper-cased
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800426 self.request.sendall(self.data.upper())
Georg Brandlb533e262008-05-25 18:19:30 +0000427
428 if __name__ == "__main__":
429 HOST, PORT = "localhost", 9999
430
431 # Create the server, binding to localhost on port 9999
432 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
433
434 # Activate the server; this will keep running until you
435 # interrupt the program with Ctrl-C
436 server.serve_forever()
437
438An alternative request handler class that makes use of streams (file-like
439objects that simplify communication by providing the standard file interface)::
440
441 class MyTCPHandler(socketserver.StreamRequestHandler):
442
443 def handle(self):
444 # self.rfile is a file-like object created by the handler;
445 # we can now use e.g. readline() instead of raw recv() calls
446 self.data = self.rfile.readline().strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200447 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000448 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000449 # Likewise, self.wfile is a file-like object used to write back
450 # to the client
451 self.wfile.write(self.data.upper())
452
453The difference is that the ``readline()`` call in the second handler will call
454``recv()`` multiple times until it encounters a newline character, while the
455single ``recv()`` call in the first handler will just return what has been sent
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800456from the client in one ``sendall()`` call.
Georg Brandlb533e262008-05-25 18:19:30 +0000457
458
459This is the client side::
460
461 import socket
462 import sys
463
464 HOST, PORT = "localhost", 9999
465 data = " ".join(sys.argv[1:])
466
467 # Create a socket (SOCK_STREAM means a TCP socket)
468 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
469
Florent Xicluna023611f2011-10-23 22:40:37 +0200470 try:
471 # Connect to server and send data
472 sock.connect((HOST, PORT))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800473 sock.sendall(bytes(data + "\n", "utf-8"))
Georg Brandlb533e262008-05-25 18:19:30 +0000474
Florent Xicluna023611f2011-10-23 22:40:37 +0200475 # Receive data from the server and shut down
476 received = str(sock.recv(1024), "utf-8")
477 finally:
478 sock.close()
Georg Brandlb533e262008-05-25 18:19:30 +0000479
Florent Xicluna023611f2011-10-23 22:40:37 +0200480 print("Sent: {}".format(data))
481 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000482
483
484The output of the example should look something like this:
485
486Server::
487
488 $ python TCPServer.py
489 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000490 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000491 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000492 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000493
494Client::
495
496 $ python TCPClient.py hello world with TCP
497 Sent: hello world with TCP
Florent Xicluna023611f2011-10-23 22:40:37 +0200498 Received: HELLO WORLD WITH TCP
Georg Brandlb533e262008-05-25 18:19:30 +0000499 $ python TCPClient.py python is nice
500 Sent: python is nice
Florent Xicluna023611f2011-10-23 22:40:37 +0200501 Received: PYTHON IS NICE
Georg Brandlb533e262008-05-25 18:19:30 +0000502
503
504:class:`socketserver.UDPServer` Example
505~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
506
507This is the server side::
508
509 import socketserver
510
511 class MyUDPHandler(socketserver.BaseRequestHandler):
512 """
513 This class works similar to the TCP handler class, except that
514 self.request consists of a pair of data and client socket, and since
515 there is no connection the client address must be given explicitly
516 when sending data back via sendto().
517 """
518
519 def handle(self):
520 data = self.request[0].strip()
521 socket = self.request[1]
Florent Xicluna023611f2011-10-23 22:40:37 +0200522 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000523 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000524 socket.sendto(data.upper(), self.client_address)
525
526 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000527 HOST, PORT = "localhost", 9999
528 server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
529 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000530
531This is the client side::
532
533 import socket
534 import sys
535
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000536 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000537 data = " ".join(sys.argv[1:])
538
539 # SOCK_DGRAM is the socket type to use for UDP sockets
540 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
541
542 # As you can see, there is no connect() call; UDP has no connections.
543 # Instead, data is directly sent to the recipient via sendto().
Florent Xicluna023611f2011-10-23 22:40:37 +0200544 sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
545 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000546
Florent Xicluna023611f2011-10-23 22:40:37 +0200547 print("Sent: {}".format(data))
548 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000549
550The output of the example should look exactly like for the TCP server example.
551
552
553Asynchronous Mixins
554~~~~~~~~~~~~~~~~~~~
555
556To build asynchronous handlers, use the :class:`ThreadingMixIn` and
557:class:`ForkingMixIn` classes.
558
559An example for the :class:`ThreadingMixIn` class::
560
561 import socket
562 import threading
563 import socketserver
564
565 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
566
567 def handle(self):
Florent Xicluna023611f2011-10-23 22:40:37 +0200568 data = str(self.request.recv(1024), 'ascii')
Georg Brandlf9926402008-06-13 06:32:25 +0000569 cur_thread = threading.current_thread()
Florent Xicluna023611f2011-10-23 22:40:37 +0200570 response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800571 self.request.sendall(response)
Georg Brandlb533e262008-05-25 18:19:30 +0000572
573 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
574 pass
575
576 def client(ip, port, message):
577 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
578 sock.connect((ip, port))
Florent Xicluna023611f2011-10-23 22:40:37 +0200579 try:
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800580 sock.sendall(bytes(message, 'ascii'))
Florent Xicluna023611f2011-10-23 22:40:37 +0200581 response = str(sock.recv(1024), 'ascii')
582 print("Received: {}".format(response))
583 finally:
584 sock.close()
Georg Brandlb533e262008-05-25 18:19:30 +0000585
586 if __name__ == "__main__":
587 # Port 0 means to select an arbitrary unused port
588 HOST, PORT = "localhost", 0
589
590 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
591 ip, port = server.server_address
592
593 # Start a thread with the server -- that thread will then start one
594 # more thread for each request
595 server_thread = threading.Thread(target=server.serve_forever)
596 # Exit the server thread when the main thread terminates
Florent Xicluna023611f2011-10-23 22:40:37 +0200597 server_thread.daemon = True
Georg Brandlb533e262008-05-25 18:19:30 +0000598 server_thread.start()
Benjamin Petersond75fcb42009-02-19 04:22:03 +0000599 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000600
Florent Xicluna023611f2011-10-23 22:40:37 +0200601 client(ip, port, "Hello World 1")
602 client(ip, port, "Hello World 2")
603 client(ip, port, "Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000604
605 server.shutdown()
Robert Collins1ee92832015-07-29 12:52:40 +1200606 server.server_close()
Georg Brandlb533e262008-05-25 18:19:30 +0000607
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000608
Georg Brandlb533e262008-05-25 18:19:30 +0000609The output of the example should look something like this::
610
611 $ python ThreadedTCPServer.py
612 Server loop running in thread: Thread-1
Florent Xicluna023611f2011-10-23 22:40:37 +0200613 Received: Thread-2: Hello World 1
614 Received: Thread-3: Hello World 2
615 Received: Thread-4: Hello World 3
Georg Brandlb533e262008-05-25 18:19:30 +0000616
617
618The :class:`ForkingMixIn` class is used in the same way, except that the server
619will spawn a new process for each request.