blob: ed547f5ea28beeb3936ea081974edbc3999f7da8 [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
36the server's address and the request handler class. Finally, call the
37:meth:`handle_request` or :meth:`serve_forever` method of the server object to
38process one or many requests.
39
40When inheriting from :class:`ThreadingMixIn` for threaded connection behavior,
41you should explicitly declare how you want your threads to behave on an abrupt
42shutdown. The :class:`ThreadingMixIn` class defines an attribute
43*daemon_threads*, which indicates whether or not the server should wait for
44thread termination. You should set the flag explicitly if you would like threads
45to behave autonomously; the default is :const:`False`, meaning that Python will
46not exit until all threads created by :class:`ThreadingMixIn` have exited.
47
48Server classes have the same external methods and attributes, no matter what
Georg Brandlfceab5a2008-01-19 20:08:23 +000049network protocol they use.
Georg Brandl116aa622007-08-15 14:28:22 +000050
51
52Server Creation Notes
53---------------------
54
55There are five classes in an inheritance diagram, four of which represent
56synchronous servers of four types::
57
58 +------------+
59 | BaseServer |
60 +------------+
61 |
62 v
63 +-----------+ +------------------+
64 | TCPServer |------->| UnixStreamServer |
65 +-----------+ +------------------+
66 |
67 v
68 +-----------+ +--------------------+
69 | UDPServer |------->| UnixDatagramServer |
70 +-----------+ +--------------------+
71
72Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from
73:class:`UnixStreamServer` --- the only difference between an IP and a Unix
74stream server is the address family, which is simply repeated in both Unix
75server classes.
76
77Forking and threading versions of each type of server can be created using the
78:class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes. For instance,
79a threading UDP server class is created as follows::
80
81 class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
82
83The mix-in class must come first, since it overrides a method defined in
84:class:`UDPServer`. Setting the various member variables also changes the
85behavior of the underlying server mechanism.
86
87To implement a service, you must derive a class from :class:`BaseRequestHandler`
88and redefine its :meth:`handle` method. You can then run various versions of
89the service by combining one of the server classes with your request handler
90class. The request handler class must be different for datagram or stream
91services. This can be hidden by using the handler subclasses
92:class:`StreamRequestHandler` or :class:`DatagramRequestHandler`.
93
94Of course, you still have to use your head! For instance, it makes no sense to
95use a forking server if the service contains state in memory that can be
96modified by different requests, since the modifications in the child process
97would never reach the initial state kept in the parent process and passed to
98each child. In this case, you can use a threading server, but you will probably
99have to use locks to protect the integrity of the shared data.
100
101On the other hand, if you are building an HTTP server where all data is stored
102externally (for instance, in the file system), a synchronous class will
103essentially render the service "deaf" while one request is being handled --
104which may be for a very long time if a client is slow to receive all the data it
105has requested. Here a threading or forking server is appropriate.
106
107In some cases, it may be appropriate to process part of a request synchronously,
108but to finish processing in a forked child depending on the request data. This
109can be implemented by using a synchronous server and doing an explicit fork in
110the request handler class :meth:`handle` method.
111
112Another approach to handling multiple simultaneous requests in an environment
113that supports neither threads nor :func:`fork` (or where these are too expensive
114or inappropriate for the service) is to maintain an explicit table of partially
115finished requests and to use :func:`select` to decide which request to work on
116next (or whether to handle a new incoming request). This is particularly
117important for stream services where each client can potentially be connected for
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000118a long time (if threads or subprocesses cannot be used). See :mod:`asyncore` for
119another way to manage this.
Georg Brandl116aa622007-08-15 14:28:22 +0000120
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000121.. XXX should data and methods be intermingled, or separate?
122 how should the distinction between class and instance variables be drawn?
Georg Brandl116aa622007-08-15 14:28:22 +0000123
124
125Server Objects
126--------------
127
Benjamin Petersond23f8222009-04-05 19:13:16 +0000128.. class:: BaseServer
Georg Brandl116aa622007-08-15 14:28:22 +0000129
Benjamin Petersond23f8222009-04-05 19:13:16 +0000130 This is the superclass of all Server objects in the module. It defines the
131 interface, given below, but does not implement most of the methods, which is
132 done in subclasses.
133
134
135.. method:: BaseServer.fileno()
Georg Brandl116aa622007-08-15 14:28:22 +0000136
137 Return an integer file descriptor for the socket on which the server is
138 listening. This function is most commonly passed to :func:`select.select`, to
139 allow monitoring multiple servers in the same process.
140
141
Benjamin Petersond23f8222009-04-05 19:13:16 +0000142.. method:: BaseServer.handle_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000143
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000144 Process a single request. This function calls the following methods in
145 order: :meth:`get_request`, :meth:`verify_request`, and
146 :meth:`process_request`. If the user-provided :meth:`handle` method of the
147 handler class raises an exception, the server's :meth:`handle_error` method
148 will be called. If no request is received within :attr:`self.timeout`
149 seconds, :meth:`handle_timeout` will be called and :meth:`handle_request`
150 will return.
Georg Brandl116aa622007-08-15 14:28:22 +0000151
152
Benjamin Petersond23f8222009-04-05 19:13:16 +0000153.. method:: BaseServer.serve_forever(poll_interval=0.5)
Georg Brandl116aa622007-08-15 14:28:22 +0000154
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000155 Handle requests until an explicit :meth:`shutdown` request. Polls for
156 shutdown every *poll_interval* seconds.
157
158
Benjamin Petersond23f8222009-04-05 19:13:16 +0000159.. method:: BaseServer.shutdown()
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000160
161 Tells the :meth:`serve_forever` loop to stop and waits until it does.
Georg Brandl116aa622007-08-15 14:28:22 +0000162
163
Benjamin Petersond23f8222009-04-05 19:13:16 +0000164.. attribute:: BaseServer.address_family
Georg Brandl116aa622007-08-15 14:28:22 +0000165
166 The family of protocols to which the server's socket belongs.
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000167 Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`.
Georg Brandl116aa622007-08-15 14:28:22 +0000168
169
Benjamin Petersond23f8222009-04-05 19:13:16 +0000170.. attribute:: BaseServer.RequestHandlerClass
Georg Brandl116aa622007-08-15 14:28:22 +0000171
172 The user-provided request handler class; an instance of this class is created
173 for each request.
174
175
Benjamin Petersond23f8222009-04-05 19:13:16 +0000176.. attribute:: BaseServer.server_address
Georg Brandl116aa622007-08-15 14:28:22 +0000177
178 The address on which the server is listening. The format of addresses varies
179 depending on the protocol family; see the documentation for the socket module
180 for details. For Internet protocols, this is a tuple containing a string giving
181 the address, and an integer port number: ``('127.0.0.1', 80)``, for example.
182
183
Benjamin Petersond23f8222009-04-05 19:13:16 +0000184.. attribute:: BaseServer.socket
Georg Brandl116aa622007-08-15 14:28:22 +0000185
186 The socket object on which the server will listen for incoming requests.
187
Benjamin Petersond23f8222009-04-05 19:13:16 +0000188
Georg Brandl116aa622007-08-15 14:28:22 +0000189The server classes support the following class variables:
190
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000191.. XXX should class variables be covered before instance variables, or vice versa?
Georg Brandl116aa622007-08-15 14:28:22 +0000192
Benjamin Petersond23f8222009-04-05 19:13:16 +0000193.. attribute:: BaseServer.allow_reuse_address
Georg Brandl116aa622007-08-15 14:28:22 +0000194
195 Whether the server will allow the reuse of an address. This defaults to
196 :const:`False`, and can be set in subclasses to change the policy.
197
198
Benjamin Petersond23f8222009-04-05 19:13:16 +0000199.. attribute:: BaseServer.request_queue_size
Georg Brandl116aa622007-08-15 14:28:22 +0000200
201 The size of the request queue. If it takes a long time to process a single
202 request, any requests that arrive while the server is busy are placed into a
203 queue, up to :attr:`request_queue_size` requests. Once the queue is full,
204 further requests from clients will get a "Connection denied" error. The default
205 value is usually 5, but this can be overridden by subclasses.
206
207
Benjamin Petersond23f8222009-04-05 19:13:16 +0000208.. attribute:: BaseServer.socket_type
Georg Brandl116aa622007-08-15 14:28:22 +0000209
210 The type of socket used by the server; :const:`socket.SOCK_STREAM` and
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000211 :const:`socket.SOCK_DGRAM` are two common values.
Georg Brandl116aa622007-08-15 14:28:22 +0000212
Benjamin Petersond23f8222009-04-05 19:13:16 +0000213
214.. attribute:: BaseServer.timeout
Georg Brandlfceab5a2008-01-19 20:08:23 +0000215
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000216 Timeout duration, measured in seconds, or :const:`None` if no timeout is
217 desired. If :meth:`handle_request` receives no incoming requests within the
218 timeout period, the :meth:`handle_timeout` method is called.
Georg Brandlfceab5a2008-01-19 20:08:23 +0000219
Benjamin Petersond23f8222009-04-05 19:13:16 +0000220
Georg Brandl116aa622007-08-15 14:28:22 +0000221There are various server methods that can be overridden by subclasses of base
222server classes like :class:`TCPServer`; these methods aren't useful to external
223users of the server object.
224
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000225.. XXX should the default implementations of these be documented, or should
Alexandre Vassalottice261952008-05-12 02:31:37 +0000226 it be assumed that the user will look at socketserver.py?
Georg Brandl116aa622007-08-15 14:28:22 +0000227
Benjamin Petersond23f8222009-04-05 19:13:16 +0000228.. method:: BaseServer.finish_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000229
230 Actually processes the request by instantiating :attr:`RequestHandlerClass` and
231 calling its :meth:`handle` method.
232
233
Benjamin Petersond23f8222009-04-05 19:13:16 +0000234.. method:: BaseServer.get_request()
Georg Brandl116aa622007-08-15 14:28:22 +0000235
236 Must accept a request from the socket, and return a 2-tuple containing the *new*
237 socket object to be used to communicate with the client, and the client's
238 address.
239
240
Benjamin Petersond23f8222009-04-05 19:13:16 +0000241.. method:: BaseServer.handle_error(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000242
243 This function is called if the :attr:`RequestHandlerClass`'s :meth:`handle`
244 method raises an exception. The default action is to print the traceback to
245 standard output and continue handling further requests.
246
Benjamin Petersond23f8222009-04-05 19:13:16 +0000247
248.. method:: BaseServer.handle_timeout()
Georg Brandlfceab5a2008-01-19 20:08:23 +0000249
Georg Brandlb533e262008-05-25 18:19:30 +0000250 This function is called when the :attr:`timeout` attribute has been set to a
251 value other than :const:`None` and the timeout period has passed with no
Georg Brandlfceab5a2008-01-19 20:08:23 +0000252 requests being received. The default action for forking servers is
253 to collect the status of any child processes that have exited, while
254 in threading servers this method does nothing.
Georg Brandl116aa622007-08-15 14:28:22 +0000255
Benjamin Petersond23f8222009-04-05 19:13:16 +0000256
257.. method:: BaseServer.process_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000258
259 Calls :meth:`finish_request` to create an instance of the
260 :attr:`RequestHandlerClass`. If desired, this function can create a new process
261 or thread to handle the request; the :class:`ForkingMixIn` and
262 :class:`ThreadingMixIn` classes do this.
263
Benjamin Petersond23f8222009-04-05 19:13:16 +0000264
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000265.. Is there any point in documenting the following two functions?
266 What would the purpose of overriding them be: initializing server
267 instance variables, adding new network families?
Georg Brandl116aa622007-08-15 14:28:22 +0000268
Benjamin Petersond23f8222009-04-05 19:13:16 +0000269.. method:: BaseServer.server_activate()
Georg Brandl116aa622007-08-15 14:28:22 +0000270
271 Called by the server's constructor to activate the server. The default behavior
272 just :meth:`listen`\ s to the server's socket. May be overridden.
273
274
Benjamin Petersond23f8222009-04-05 19:13:16 +0000275.. method:: BaseServer.server_bind()
Georg Brandl116aa622007-08-15 14:28:22 +0000276
277 Called by the server's constructor to bind the socket to the desired address.
278 May be overridden.
279
280
Benjamin Petersond23f8222009-04-05 19:13:16 +0000281.. method:: BaseServer.verify_request(request, client_address)
Georg Brandl116aa622007-08-15 14:28:22 +0000282
283 Must return a Boolean value; if the value is :const:`True`, the request will be
284 processed, and if it's :const:`False`, the request will be denied. This function
285 can be overridden to implement access controls for a server. The default
286 implementation always returns :const:`True`.
287
288
289RequestHandler Objects
290----------------------
291
292The request handler class must define a new :meth:`handle` method, and can
293override any of the following methods. A new instance is created for each
294request.
295
296
Benjamin Petersond23f8222009-04-05 19:13:16 +0000297.. method:: RequestHandler.finish()
Georg Brandl116aa622007-08-15 14:28:22 +0000298
Georg Brandlb533e262008-05-25 18:19:30 +0000299 Called after the :meth:`handle` method to perform any clean-up actions
300 required. The default implementation does nothing. If :meth:`setup` or
301 :meth:`handle` raise an exception, this function will not be called.
Georg Brandl116aa622007-08-15 14:28:22 +0000302
303
Benjamin Petersond23f8222009-04-05 19:13:16 +0000304.. method:: RequestHandler.handle()
Georg Brandl116aa622007-08-15 14:28:22 +0000305
Georg Brandlb533e262008-05-25 18:19:30 +0000306 This function must do all the work required to service a request. The
307 default implementation does nothing. Several instance attributes are
308 available to it; the request is available as :attr:`self.request`; the client
309 address as :attr:`self.client_address`; and the server instance as
310 :attr:`self.server`, in case it needs access to per-server information.
Georg Brandl116aa622007-08-15 14:28:22 +0000311
Georg Brandlb533e262008-05-25 18:19:30 +0000312 The type of :attr:`self.request` is different for datagram or stream
313 services. For stream services, :attr:`self.request` is a socket object; for
314 datagram services, :attr:`self.request` is a pair of string and socket.
315 However, this can be hidden by using the request handler subclasses
316 :class:`StreamRequestHandler` or :class:`DatagramRequestHandler`, which
317 override the :meth:`setup` and :meth:`finish` methods, and provide
318 :attr:`self.rfile` and :attr:`self.wfile` attributes. :attr:`self.rfile` and
319 :attr:`self.wfile` can be read or written, respectively, to get the request
320 data or return data to the client.
Georg Brandl116aa622007-08-15 14:28:22 +0000321
322
Benjamin Petersond23f8222009-04-05 19:13:16 +0000323.. method:: RequestHandler.setup()
Georg Brandl116aa622007-08-15 14:28:22 +0000324
325 Called before the :meth:`handle` method to perform any initialization actions
326 required. The default implementation does nothing.
327
Georg Brandlb533e262008-05-25 18:19:30 +0000328
329Examples
330--------
331
332:class:`socketserver.TCPServer` Example
333~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
334
335This is the server side::
336
337 import socketserver
338
339 class MyTCPHandler(socketserver.BaseRequestHandler):
340 """
341 The RequestHandler class for our server.
342
343 It is instantiated once per connection to the server, and must
344 override the handle() method to implement communication to the
345 client.
346 """
347
348 def handle(self):
349 # self.request is the TCP socket connected to the client
350 self.data = self.request.recv(1024).strip()
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000351 print("%s wrote:" % self.client_address[0])
352 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000353 # just send back the same data, but upper-cased
354 self.request.send(self.data.upper())
355
356 if __name__ == "__main__":
357 HOST, PORT = "localhost", 9999
358
359 # Create the server, binding to localhost on port 9999
360 server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
361
362 # Activate the server; this will keep running until you
363 # interrupt the program with Ctrl-C
364 server.serve_forever()
365
366An alternative request handler class that makes use of streams (file-like
367objects that simplify communication by providing the standard file interface)::
368
369 class MyTCPHandler(socketserver.StreamRequestHandler):
370
371 def handle(self):
372 # self.rfile is a file-like object created by the handler;
373 # we can now use e.g. readline() instead of raw recv() calls
374 self.data = self.rfile.readline().strip()
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000375 print("%s wrote:" % self.client_address[0])
376 print(self.data)
Georg Brandlb533e262008-05-25 18:19:30 +0000377 # Likewise, self.wfile is a file-like object used to write back
378 # to the client
379 self.wfile.write(self.data.upper())
380
381The difference is that the ``readline()`` call in the second handler will call
382``recv()`` multiple times until it encounters a newline character, while the
383single ``recv()`` call in the first handler will just return what has been sent
384from the client in one ``send()`` call.
385
386
387This is the client side::
388
389 import socket
390 import sys
391
392 HOST, PORT = "localhost", 9999
393 data = " ".join(sys.argv[1:])
394
395 # Create a socket (SOCK_STREAM means a TCP socket)
396 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
397
398 # Connect to server and send data
399 sock.connect((HOST, PORT))
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000400 sock.send(bytes(data + "\n","utf8"))
Georg Brandlb533e262008-05-25 18:19:30 +0000401
402 # Receive data from the server and shut down
403 received = sock.recv(1024)
404 sock.close()
405
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000406 print("Sent: %s" % data)
407 print("Received: %s" % received)
Georg Brandlb533e262008-05-25 18:19:30 +0000408
409
410The output of the example should look something like this:
411
412Server::
413
414 $ python TCPServer.py
415 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000416 b'hello world with TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000417 127.0.0.1 wrote:
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000418 b'python is nice'
Georg Brandlb533e262008-05-25 18:19:30 +0000419
420Client::
421
422 $ python TCPClient.py hello world with TCP
423 Sent: hello world with TCP
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000424 Received: b'HELLO WORLD WITH TCP'
Georg Brandlb533e262008-05-25 18:19:30 +0000425 $ python TCPClient.py python is nice
426 Sent: python is nice
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000427 Received: b'PYTHON IS NICE'
Georg Brandlb533e262008-05-25 18:19:30 +0000428
429
430:class:`socketserver.UDPServer` Example
431~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
432
433This is the server side::
434
435 import socketserver
436
437 class MyUDPHandler(socketserver.BaseRequestHandler):
438 """
439 This class works similar to the TCP handler class, except that
440 self.request consists of a pair of data and client socket, and since
441 there is no connection the client address must be given explicitly
442 when sending data back via sendto().
443 """
444
445 def handle(self):
446 data = self.request[0].strip()
447 socket = self.request[1]
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000448 print("%s wrote:" % self.client_address[0])
449 print(data)
Georg Brandlb533e262008-05-25 18:19:30 +0000450 socket.sendto(data.upper(), self.client_address)
451
452 if __name__ == "__main__":
Benjamin Peterson20211002009-11-25 18:34:42 +0000453 HOST, PORT = "localhost", 9999
454 server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
455 server.serve_forever()
Georg Brandlb533e262008-05-25 18:19:30 +0000456
457This is the client side::
458
459 import socket
460 import sys
461
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000462 HOST, PORT = "localhost", 9999
Georg Brandlb533e262008-05-25 18:19:30 +0000463 data = " ".join(sys.argv[1:])
464
465 # SOCK_DGRAM is the socket type to use for UDP sockets
466 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
467
468 # As you can see, there is no connect() call; UDP has no connections.
469 # Instead, data is directly sent to the recipient via sendto().
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000470 sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT))
Georg Brandlb533e262008-05-25 18:19:30 +0000471 received = sock.recv(1024)
472
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000473 print("Sent: %s" % data)
474 print("Received: %s" % received)
Georg Brandlb533e262008-05-25 18:19:30 +0000475
476The output of the example should look exactly like for the TCP server example.
477
478
479Asynchronous Mixins
480~~~~~~~~~~~~~~~~~~~
481
482To build asynchronous handlers, use the :class:`ThreadingMixIn` and
483:class:`ForkingMixIn` classes.
484
485An example for the :class:`ThreadingMixIn` class::
486
487 import socket
488 import threading
489 import socketserver
490
491 class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
492
493 def handle(self):
494 data = self.request.recv(1024)
Georg Brandlf9926402008-06-13 06:32:25 +0000495 cur_thread = threading.current_thread()
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000496 response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii')
Georg Brandlb533e262008-05-25 18:19:30 +0000497 self.request.send(response)
498
499 class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
500 pass
501
502 def client(ip, port, message):
503 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
504 sock.connect((ip, port))
505 sock.send(message)
506 response = sock.recv(1024)
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000507 print("Received: %s" % response)
Georg Brandlb533e262008-05-25 18:19:30 +0000508 sock.close()
509
510 if __name__ == "__main__":
511 # Port 0 means to select an arbitrary unused port
512 HOST, PORT = "localhost", 0
513
514 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
515 ip, port = server.server_address
516
517 # Start a thread with the server -- that thread will then start one
518 # more thread for each request
519 server_thread = threading.Thread(target=server.serve_forever)
520 # Exit the server thread when the main thread terminates
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000521 server_thread.setDaemon(True)
Georg Brandlb533e262008-05-25 18:19:30 +0000522 server_thread.start()
Benjamin Petersond75fcb42009-02-19 04:22:03 +0000523 print("Server loop running in thread:", server_thread.name)
Georg Brandlb533e262008-05-25 18:19:30 +0000524
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000525 client(ip, port, b"Hello World 1")
526 client(ip, port, b"Hello World 2")
527 client(ip, port, b"Hello World 3")
Georg Brandlb533e262008-05-25 18:19:30 +0000528
529 server.shutdown()
530
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000531
Georg Brandlb533e262008-05-25 18:19:30 +0000532The output of the example should look something like this::
533
534 $ python ThreadedTCPServer.py
535 Server loop running in thread: Thread-1
Benjamin Peterson06fd5f82008-11-08 17:24:34 +0000536 Received: b"Thread-2: b'Hello World 1'"
537 Received: b"Thread-3: b'Hello World 2'"
538 Received: b"Thread-4: b'Hello World 3'"
Georg Brandlb533e262008-05-25 18:19:30 +0000539
540
541The :class:`ForkingMixIn` class is used in the same way, except that the server
542will spawn a new process for each request.