blob: 18be936b08ebc611aa960917f1a74fc01db1e88f [file] [log] [blame]
Alexandre Vassalottice261952008-05-12 02:31:37 +00001:mod:`socketserver` --- A framework for network servers
Georg Brandl116aa622007-08-15 14:28:22 +00002=======================================================
3
Alexandre Vassalottice261952008-05-12 02:31:37 +00004.. module:: socketserver
Georg Brandl116aa622007-08-15 14:28:22 +00005 :synopsis: A framework for network servers.
6
Raymond Hettinger469271d2011-01-27 20:38:46 +00007**Source code:** :source:`Lib/socketserver.py`
8
9--------------
10
Alexandre Vassalottice261952008-05-12 02:31:37 +000011The :mod:`socketserver` module simplifies the task of writing network servers.
Georg Brandl116aa622007-08-15 14:28:22 +000012
13There are four basic server classes: :class:`TCPServer` uses the Internet TCP
14protocol, which provides for continuous streams of data between the client and
15server. :class:`UDPServer` uses datagrams, which are discrete packets of
16information that may arrive out of order or be lost while in transit. The more
17infrequently used :class:`UnixStreamServer` and :class:`UnixDatagramServer`
18classes are similar, but use Unix domain sockets; they're not available on
19non-Unix platforms. For more details on network programming, consult a book
20such as
21W. Richard Steven's UNIX Network Programming or Ralph Davis's Win32 Network
22Programming.
23
24These four classes process requests :dfn:`synchronously`; each request must be
25completed before the next request can be started. This isn't suitable if each
26request takes a long time to complete, because it requires a lot of computation,
27or because it returns a lot of data which the client is slow to process. The
28solution is to create a separate process or thread to handle each request; the
29:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes can be used to
30support asynchronous behaviour.
31
32Creating a server requires several steps. First, you must create a request
33handler class by subclassing the :class:`BaseRequestHandler` class and
34overriding its :meth:`handle` method; this method will process incoming
35requests. Second, you must instantiate one of the server classes, passing it
Robert Collins1ee92832015-07-29 12:52:40 +120036the server's address and the request handler class. Then call the
Georg Brandl116aa622007-08-15 14:28:22 +000037:meth:`handle_request` or :meth:`serve_forever` method of the server object to
Robert Collins1ee92832015-07-29 12:52:40 +120038process one or many requests. Finally, call :meth:`~BaseServer.server_close`
39to close the socket.
Georg Brandl116aa622007-08-15 14:28:22 +000040
41When inheriting from :class:`ThreadingMixIn` for threaded connection behavior,
42you should explicitly declare how you want your threads to behave on an abrupt
Florent Xicluna599d76b2011-11-11 19:56:26 +010043shutdown. The :class:`ThreadingMixIn` class defines an attribute
Georg Brandl116aa622007-08-15 14:28:22 +000044*daemon_threads*, which indicates whether or not the server should wait for
Florent Xicluna599d76b2011-11-11 19:56:26 +010045thread termination. You should set the flag explicitly if you would like
46threads to behave autonomously; the default is :const:`False`, meaning that
47Python will not exit until all threads created by :class:`ThreadingMixIn` have
48exited.
Georg Brandl116aa622007-08-15 14:28:22 +000049
50Server classes have the same external methods and attributes, no matter what
Georg Brandlfceab5a2008-01-19 20:08:23 +000051network protocol they use.
Georg Brandl116aa622007-08-15 14:28:22 +000052
53
54Server Creation Notes
55---------------------
56
57There are five classes in an inheritance diagram, four of which represent
58synchronous servers of four types::
59
60 +------------+
61 | BaseServer |
62 +------------+
63 |
64 v
65 +-----------+ +------------------+
66 | TCPServer |------->| UnixStreamServer |
67 +-----------+ +------------------+
68 |
69 v
70 +-----------+ +--------------------+
71 | UDPServer |------->| UnixDatagramServer |
72 +-----------+ +--------------------+
73
74Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from
75:class:`UnixStreamServer` --- the only difference between an IP and a Unix
76stream server is the address family, which is simply repeated in both Unix
77server classes.
78
79Forking and threading versions of each type of server can be created using the
80:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes. For instance,
81a threading UDP server class is created as follows::
82
83 class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
84
85The mix-in class must come first, since it overrides a method defined in
Senthil Kumarana6bac952011-07-04 11:28:30 -070086:class:`UDPServer`. Setting the various attributes also change the
Georg Brandl116aa622007-08-15 14:28:22 +000087behavior of the underlying server mechanism.
88
89To implement a service, you must derive a class from :class:`BaseRequestHandler`
90and redefine its :meth:`handle` method. You can then run various versions of
91the service by combining one of the server classes with your request handler
92class. The request handler class must be different for datagram or stream
93services. This can be hidden by using the handler subclasses
94:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
95
96Of course, you still have to use your head! For instance, it makes no sense to
97use a forking server if the service contains state in memory that can be
98modified by different requests, since the modifications in the child process
99would never reach the initial state kept in the parent process and passed to
100each child. In this case, you can use a threading server, but you will probably
101have to use locks to protect the integrity of the shared data.
102
103On the other hand, if you are building an HTTP server where all data is stored
104externally (for instance, in the file system), a synchronous class will
105essentially render the service "deaf" while one request is being handled --
106which may be for a very long time if a client is slow to receive all the data it
107has requested. Here a threading or forking server is appropriate.
108
109In some cases, it may be appropriate to process part of a request synchronously,
110but to finish processing in a forked child depending on the request data. This
111can be implemented by using a synchronous server and doing an explicit fork in
112the request handler class :meth:`handle` method.
113
114Another approach to handling multiple simultaneous requests in an environment
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300115that supports neither threads nor :func:`~os.fork` (or where these are too
116expensive or inappropriate for the service) is to maintain an explicit table of
Charles-François Natali1d29cc52014-03-24 22:25:39 +0000117partially finished requests and to use :mod:`selectors` to decide which
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300118request to work on next (or whether to handle a new incoming request). This is
119particularly important for stream services where each client can potentially be
120connected for a long time (if threads or subprocesses cannot be used). See
121:mod:`asyncore` for another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000122
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000123.. XXX should data and methods be intermingled, or separate?
124 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000125
126
127Server Objects
128--------------
129
Benjamin Petersond23f8222009-04-05 19:13:16 +0000130.. class:: BaseServer
Georg Brandl116aa622007-08-15 14:28:22 +0000131
Benjamin Petersond23f8222009-04-05 19:13:16 +0000132 This is the superclass of all Server objects in the module. It defines the
133 interface, given below, but does not implement most of the methods, which is
134 done in subclasses.
135
136
137.. method:: BaseServer.fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000138
139 Return an integer file descriptor for the socket on which the server is
Charles-François Natali1d29cc52014-03-24 22:25:39 +0000140 listening. This function is most commonly passed to :mod:`selectors`, to
Georg Brandl116aa622007-08-15 14:28:22 +0000141 allow monitoring multiple servers in the same process.
142
143
Benjamin Petersond23f8222009-04-05 19:13:16 +0000144.. method:: BaseServer.handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000145
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000146 Process a single request. This function calls the following methods in
147 order: :meth:`get_request`, :meth:`verify_request`, and
148 :meth:`process_request`. If the user-provided :meth:`handle` method of the
149 handler class raises an exception, the server's :meth:`handle_error` method
150 will be called. If no request is received within :attr:`self.timeout`
151 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
152 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000153
154
Benjamin Petersond23f8222009-04-05 19:13:16 +0000155.. method:: BaseServer.serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000156
R David Murray258fabe2012-10-01 21:43:46 -0400157 Handle requests until an explicit :meth:`shutdown` request. Poll for
158 shutdown every *poll_interval* seconds. Ignores :attr:`self.timeout`. It
159 also calls :meth:`service_actions`, which may be used by a subclass or mixin
160 to provide actions specific to a given service. For example, the
161 :class:`ForkingMixIn` class uses :meth:`service_actions` to clean up zombie
162 child processes.
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000163
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800164 .. versionchanged:: 3.3
R David Murray258fabe2012-10-01 21:43:46 -0400165 Added ``service_actions`` call to the ``serve_forever`` method.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800166
167
168.. method:: BaseServer.service_actions()
169
Ezio Melottia3b255f2013-04-12 19:19:21 +0300170 This is called in the :meth:`serve_forever` loop. This method can be
R David Murray258fabe2012-10-01 21:43:46 -0400171 overridden by subclasses or mixin classes to perform actions specific to
172 a given service, such as cleanup actions.
Senthil Kumaran5e826e82011-05-26 00:22:59 +0800173
174 .. versionadded:: 3.3
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000175
Benjamin Petersond23f8222009-04-05 19:13:16 +0000176.. method:: BaseServer.shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000177
Sandro Tosi753b79c2012-01-03 22:35:54 +0100178 Tell the :meth:`serve_forever` loop to stop and wait until it does.
Georg Brandl116aa622007-08-15 14:28:22 +0000179
180
Robert Collins1ee92832015-07-29 12:52:40 +1200181.. method:: BaseServer.server_close()
182
183 Clean up the server. May be overridden.
184
185 .. versionadded:: 2.6
186
187
Benjamin Petersond23f8222009-04-05 19:13:16 +0000188.. attribute:: BaseServer.address_family
Georg Brandl116aa622007-08-15 14:28:22 +0000189
190 The family of protocols to which the server's socket belongs.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000191 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Georg Brandl116aa622007-08-15 14:28:22 +0000192
193
Benjamin Petersond23f8222009-04-05 19:13:16 +0000194.. attribute:: BaseServer.RequestHandlerClass
Georg Brandl116aa622007-08-15 14:28:22 +0000195
196 The user-provided request handler class; an instance of this class is created
197 for each request.
198
199
Benjamin Petersond23f8222009-04-05 19:13:16 +0000200.. attribute:: BaseServer.server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000201
202 The address on which the server is listening. The format of addresses varies
203 depending on the protocol family; see the documentation for the socket module
204 for details. For Internet protocols, this is a tuple containing a string giving
205 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
206
207
Benjamin Petersond23f8222009-04-05 19:13:16 +0000208.. attribute:: BaseServer.socket
Georg Brandl116aa622007-08-15 14:28:22 +0000209
210 The socket object on which the server will listen for incoming requests.
211
Benjamin Petersond23f8222009-04-05 19:13:16 +0000212
Georg Brandl116aa622007-08-15 14:28:22 +0000213The server classes support the following class variables:
214
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000215.. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000216
Benjamin Petersond23f8222009-04-05 19:13:16 +0000217.. attribute:: BaseServer.allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000218
Florent Xicluna599d76b2011-11-11 19:56:26 +0100219 Whether the server will allow the reuse of an address. This defaults to
Georg Brandl116aa622007-08-15 14:28:22 +0000220 :const:`False`, and can be set in subclasses to change the policy.
221
222
Benjamin Petersond23f8222009-04-05 19:13:16 +0000223.. attribute:: BaseServer.request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000224
225 The size of the request queue. If it takes a long time to process a single
226 request, any requests that arrive while the server is busy are placed into a
227 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
228 further requests from clients will get a "Connection denied" error. The default
229 value is usually 5, but this can be overridden by subclasses.
230
231
Benjamin Petersond23f8222009-04-05 19:13:16 +0000232.. attribute:: BaseServer.socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000233
234 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000235 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000236
Benjamin Petersond23f8222009-04-05 19:13:16 +0000237
238.. attribute:: BaseServer.timeout
Georg Brandlfceab5a2008-01-19 20:08:23 +0000239
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000240 Timeout duration, measured in seconds, or :const:`None` if no timeout is
241 desired. If :meth:`handle_request` receives no incoming requests within the
242 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000243
Benjamin Petersond23f8222009-04-05 19:13:16 +0000244
Georg Brandl116aa622007-08-15 14:28:22 +0000245There are various server methods that can be overridden by subclasses of base
246server classes like :class:`TCPServer`; these methods aren't useful to external
247users of the server object.
248
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000249.. XXX should the default implementations of these be documented, or should
Alexandre Vassalottice261952008-05-12 02:31:37 +0000250 it be assumed that the user will look at socketserver.py?
Georg Brandl116aa622007-08-15 14:28:22 +0000251
Benjamin Petersond23f8222009-04-05 19:13:16 +0000252.. method:: BaseServer.finish_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000253
254 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
255 calling its :meth:`handle` method.
256
257
Benjamin Petersond23f8222009-04-05 19:13:16 +0000258.. method:: BaseServer.get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000259
260 Must accept a request from the socket, and return a 2-tuple containing the *new*
261 socket object to be used to communicate with the client, and the client's
262 address.
263
264
Benjamin Petersond23f8222009-04-05 19:13:16 +0000265.. method:: BaseServer.handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000266
267 This function is called if the :attr:`RequestHandlerClass`'s :meth:`handle`
268 method raises an exception. The default action is to print the traceback to
269 standard output and continue handling further requests.
270
Benjamin Petersond23f8222009-04-05 19:13:16 +0000271
272.. method:: BaseServer.handle_timeout()
Georg Brandlfceab5a2008-01-19 20:08:23 +0000273
Georg Brandlb533e262008-05-25 18:19:30 +0000274 This function is called when the :attr:`timeout` attribute has been set to a
275 value other than :const:`None` and the timeout period has passed with no
Georg Brandlfceab5a2008-01-19 20:08:23 +0000276 requests being received. The default action for forking servers is
277 to collect the status of any child processes that have exited, while
278 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000279
Benjamin Petersond23f8222009-04-05 19:13:16 +0000280
281.. method:: BaseServer.process_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000282
283 Calls :meth:`finish_request` to create an instance of the
284 :attr:`RequestHandlerClass`. If desired, this function can create a new process
285 or thread to handle the request; the :class:`ForkingMixIn` and
286 :class:`ThreadingMixIn` classes do this.
287
Benjamin Petersond23f8222009-04-05 19:13:16 +0000288
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000289.. Is there any point in documenting the following two functions?
290 What would the purpose of overriding them be: initializing server
291 instance variables, adding new network families?
Georg Brandl116aa622007-08-15 14:28:22 +0000292
Benjamin Petersond23f8222009-04-05 19:13:16 +0000293.. method:: BaseServer.server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000294
295 Called by the server's constructor to activate the server. The default behavior
Florent Xicluna599d76b2011-11-11 19:56:26 +0100296 just :meth:`listen`\ s to the server's socket. May be overridden.
Georg Brandl116aa622007-08-15 14:28:22 +0000297
298
Benjamin Petersond23f8222009-04-05 19:13:16 +0000299.. method:: BaseServer.server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000300
301 Called by the server's constructor to bind the socket to the desired address.
302 May be overridden.
303
304
Benjamin Petersond23f8222009-04-05 19:13:16 +0000305.. method:: BaseServer.verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000306
Florent Xicluna599d76b2011-11-11 19:56:26 +0100307 Must return a Boolean value; if the value is :const:`True`, the request will
308 be processed, and if it's :const:`False`, the request will be denied. This
309 function can be overridden to implement access controls for a server. The
310 default implementation always returns :const:`True`.
Georg Brandl116aa622007-08-15 14:28:22 +0000311
312
313RequestHandler Objects
314----------------------
315
316The request handler class must define a new :meth:`handle` method, and can
317override any of the following methods. A new instance is created for each
318request.
319
320
Benjamin Petersond23f8222009-04-05 19:13:16 +0000321.. method:: RequestHandler.finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000322
Georg Brandlb533e262008-05-25 18:19:30 +0000323 Called after the :meth:`handle` method to perform any clean-up actions
Kristján Valur Jónsson36852b72012-12-25 22:46:32 +0000324 required. The default implementation does nothing. If :meth:`setup`
325 raises an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000326
327
Benjamin Petersond23f8222009-04-05 19:13:16 +0000328.. method:: RequestHandler.handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000329
Georg Brandlb533e262008-05-25 18:19:30 +0000330 This function must do all the work required to service a request. The
331 default implementation does nothing. Several instance attributes are
332 available to it; the request is available as :attr:`self.request`; the client
333 address as :attr:`self.client_address`; and the server instance as
334 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000335
Georg Brandlb533e262008-05-25 18:19:30 +0000336 The type of :attr:`self.request` is different for datagram or stream
337 services. For stream services, :attr:`self.request` is a socket object; for
338 datagram services, :attr:`self.request` is a pair of string and socket.
339 However, this can be hidden by using the request handler subclasses
340 :class:`StreamRequestHandler` or :class:`DatagramRequestHandler`, which
341 override the :meth:`setup` and :meth:`finish` methods, and provide
342 :attr:`self.rfile` and :attr:`self.wfile` attributes. :attr:`self.rfile` and
343 :attr:`self.wfile` can be read or written, respectively, to get the request
344 data or return data to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000345
346
Benjamin Petersond23f8222009-04-05 19:13:16 +0000347.. method:: RequestHandler.setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000348
349 Called before the :meth:`handle` method to perform any initialization actions
350 required. The default implementation does nothing.
351
Georg Brandlb533e262008-05-25 18:19:30 +0000352
353Examples
354--------
355
356:class:`socketserver.TCPServer` Example
357~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
358
359This is the server side::
360
361 import socketserver
362
363 class MyTCPHandler(socketserver.BaseRequestHandler):
364 """
365 The RequestHandler class for our server.
366
367 It is instantiated once per connection to the server, and must
368 override the handle() method to implement communication to the
369 client.
370 """
371
372 def handle(self):
373 # self.request is the TCP socket connected to the client
374 self.data = self.request.recv(1024).strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200375 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000376 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000377 # just send back the same data, but upper-cased
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800378 self.request.sendall(self.data.upper())
Georg Brandlb533e262008-05-25 18:19:30 +0000379
380 if __name__ == "__main__":
381 HOST, PORT = "localhost", 9999
382
383 # Create the server, binding to localhost on port 9999
384 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
385
386 # Activate the server; this will keep running until you
387 # interrupt the program with Ctrl-C
388 server.serve_forever()
389
390An alternative request handler class that makes use of streams (file-like
391objects that simplify communication by providing the standard file interface)::
392
393 class MyTCPHandler(socketserver.StreamRequestHandler):
394
395 def handle(self):
396 # self.rfile is a file-like object created by the handler;
397 # we can now use e.g. readline() instead of raw recv() calls
398 self.data = self.rfile.readline().strip()
Florent Xicluna023611f2011-10-23 22:40:37 +0200399 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000400 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000401 # Likewise, self.wfile is a file-like object used to write back
402 # to the client
403 self.wfile.write(self.data.upper())
404
405The difference is that the ``readline()`` call in the second handler will call
406``recv()`` multiple times until it encounters a newline character, while the
407single ``recv()`` call in the first handler will just return what has been sent
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800408from the client in one ``sendall()`` call.
Georg Brandlb533e262008-05-25 18:19:30 +0000409
410
411This is the client side::
412
413 import socket
414 import sys
415
416 HOST, PORT = "localhost", 9999
417 data = " ".join(sys.argv[1:])
418
419 # Create a socket (SOCK_STREAM means a TCP socket)
420 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
421
Florent Xicluna023611f2011-10-23 22:40:37 +0200422 try:
423 # Connect to server and send data
424 sock.connect((HOST, PORT))
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800425 sock.sendall(bytes(data + "\n", "utf-8"))
Georg Brandlb533e262008-05-25 18:19:30 +0000426
Florent Xicluna023611f2011-10-23 22:40:37 +0200427 # Receive data from the server and shut down
428 received = str(sock.recv(1024), "utf-8")
429 finally:
430 sock.close()
Georg Brandlb533e262008-05-25 18:19:30 +0000431
Florent Xicluna023611f2011-10-23 22:40:37 +0200432 print("Sent: {}".format(data))
433 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000434
435
436The output of the example should look something like this:
437
438Server::
439
440 $ python TCPServer.py
441 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000442 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000443 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000444 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000445
446Client::
447
448 $ python TCPClient.py hello world with TCP
449 Sent: hello world with TCP
Florent Xicluna023611f2011-10-23 22:40:37 +0200450 Received: HELLO WORLD WITH TCP
Georg Brandlb533e262008-05-25 18:19:30 +0000451 $ python TCPClient.py python is nice
452 Sent: python is nice
Florent Xicluna023611f2011-10-23 22:40:37 +0200453 Received: PYTHON IS NICE
Georg Brandlb533e262008-05-25 18:19:30 +0000454
455
456:class:`socketserver.UDPServer` Example
457~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
458
459This is the server side::
460
461 import socketserver
462
463 class MyUDPHandler(socketserver.BaseRequestHandler):
464 """
465 This class works similar to the TCP handler class, except that
466 self.request consists of a pair of data and client socket, and since
467 there is no connection the client address must be given explicitly
468 when sending data back via sendto().
469 """
470
471 def handle(self):
472 data = self.request[0].strip()
473 socket = self.request[1]
Florent Xicluna023611f2011-10-23 22:40:37 +0200474 print("{} wrote:".format(self.client_address[0]))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000475 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000476 socket.sendto(data.upper(), self.client_address)
477
478 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000479 HOST, PORT = "localhost", 9999
480 server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
481 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000482
483This is the client side::
484
485 import socket
486 import sys
487
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000488 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000489 data = " ".join(sys.argv[1:])
490
491 # SOCK_DGRAM is the socket type to use for UDP sockets
492 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
493
494 # As you can see, there is no connect() call; UDP has no connections.
495 # Instead, data is directly sent to the recipient via sendto().
Florent Xicluna023611f2011-10-23 22:40:37 +0200496 sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
497 received = str(sock.recv(1024), "utf-8")
Georg Brandlb533e262008-05-25 18:19:30 +0000498
Florent Xicluna023611f2011-10-23 22:40:37 +0200499 print("Sent: {}".format(data))
500 print("Received: {}".format(received))
Georg Brandlb533e262008-05-25 18:19:30 +0000501
502The output of the example should look exactly like for the TCP server example.
503
504
505Asynchronous Mixins
506~~~~~~~~~~~~~~~~~~~
507
508To build asynchronous handlers, use the :class:`ThreadingMixIn` and
509:class:`ForkingMixIn` classes.
510
511An example for the :class:`ThreadingMixIn` class::
512
513 import socket
514 import threading
515 import socketserver
516
517 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
518
519 def handle(self):
Florent Xicluna023611f2011-10-23 22:40:37 +0200520 data = str(self.request.recv(1024), 'ascii')
Georg Brandlf9926402008-06-13 06:32:25 +0000521 cur_thread = threading.current_thread()
Florent Xicluna023611f2011-10-23 22:40:37 +0200522 response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800523 self.request.sendall(response)
Georg Brandlb533e262008-05-25 18:19:30 +0000524
525 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
526 pass
527
528 def client(ip, port, message):
529 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
530 sock.connect((ip, port))
Florent Xicluna023611f2011-10-23 22:40:37 +0200531 try:
Senthil Kumaran6e13f132012-02-09 17:54:17 +0800532 sock.sendall(bytes(message, 'ascii'))
Florent Xicluna023611f2011-10-23 22:40:37 +0200533 response = str(sock.recv(1024), 'ascii')
534 print("Received: {}".format(response))
535 finally:
536 sock.close()
Georg Brandlb533e262008-05-25 18:19:30 +0000537
538 if __name__ == "__main__":
539 # Port 0 means to select an arbitrary unused port
540 HOST, PORT = "localhost", 0
541
542 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
543 ip, port = server.server_address
544
545 # Start a thread with the server -- that thread will then start one
546 # more thread for each request
547 server_thread = threading.Thread(target=server.serve_forever)
548 # Exit the server thread when the main thread terminates
Florent Xicluna023611f2011-10-23 22:40:37 +0200549 server_thread.daemon = True
Georg Brandlb533e262008-05-25 18:19:30 +0000550 server_thread.start()
Benjamin Petersond75fcb42009-02-19 04:22:03 +0000551 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000552
Florent Xicluna023611f2011-10-23 22:40:37 +0200553 client(ip, port, "Hello World 1")
554 client(ip, port, "Hello World 2")
555 client(ip, port, "Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000556
557 server.shutdown()
Robert Collins1ee92832015-07-29 12:52:40 +1200558 server.server_close()
Georg Brandlb533e262008-05-25 18:19:30 +0000559
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000560
Georg Brandlb533e262008-05-25 18:19:30 +0000561The output of the example should look something like this::
562
563 $ python ThreadedTCPServer.py
564 Server loop running in thread: Thread-1
Florent Xicluna023611f2011-10-23 22:40:37 +0200565 Received: Thread-2: Hello World 1
566 Received: Thread-3: Hello World 2
567 Received: Thread-4: Hello World 3
Georg Brandlb533e262008-05-25 18:19:30 +0000568
569
570The :class:`ForkingMixIn` class is used in the same way, except that the server
571will spawn a new process for each request.