| Alexandre Vassalotti | ce26195 | 2008-05-12 02:31:37 +0000 | [diff] [blame] | 1 | :mod:`socketserver` --- A framework for network servers | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 2 | ======================================================= | 
 | 3 |  | 
| Alexandre Vassalotti | ce26195 | 2008-05-12 02:31:37 +0000 | [diff] [blame] | 4 | .. module:: socketserver | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 5 |    :synopsis: A framework for network servers. | 
 | 6 |  | 
| Raymond Hettinger | 469271d | 2011-01-27 20:38:46 +0000 | [diff] [blame] | 7 | **Source code:** :source:`Lib/socketserver.py` | 
 | 8 |  | 
 | 9 | -------------- | 
 | 10 |  | 
| Alexandre Vassalotti | ce26195 | 2008-05-12 02:31:37 +0000 | [diff] [blame] | 11 | The :mod:`socketserver` module simplifies the task of writing network servers. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 12 |  | 
 | 13 | There are four basic server classes: :class:`TCPServer` uses the Internet TCP | 
 | 14 | protocol, which provides for continuous streams of data between the client and | 
 | 15 | server.  :class:`UDPServer` uses datagrams, which are discrete packets of | 
 | 16 | information that may arrive out of order or be lost while in transit.  The more | 
 | 17 | infrequently used :class:`UnixStreamServer` and :class:`UnixDatagramServer` | 
 | 18 | classes are similar, but use Unix domain sockets; they're not available on | 
 | 19 | non-Unix platforms.  For more details on network programming, consult a book | 
 | 20 | such as | 
 | 21 | W. Richard Steven's UNIX Network Programming or Ralph Davis's Win32 Network | 
 | 22 | Programming. | 
 | 23 |  | 
 | 24 | These four classes process requests :dfn:`synchronously`; each request must be | 
 | 25 | completed before the next request can be started.  This isn't suitable if each | 
 | 26 | request takes a long time to complete, because it requires a lot of computation, | 
 | 27 | or because it returns a lot of data which the client is slow to process.  The | 
 | 28 | solution 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 | 
 | 30 | support asynchronous behaviour. | 
 | 31 |  | 
 | 32 | Creating a server requires several steps.  First, you must create a request | 
 | 33 | handler class by subclassing the :class:`BaseRequestHandler` class and | 
 | 34 | overriding its :meth:`handle` method; this method will process incoming | 
 | 35 | requests.  Second, you must instantiate one of the server classes, passing it | 
 | 36 | the 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 | 
 | 38 | process one or many requests. | 
 | 39 |  | 
 | 40 | When inheriting from :class:`ThreadingMixIn` for threaded connection behavior, | 
 | 41 | you should explicitly declare how you want your threads to behave on an abrupt | 
| Florent Xicluna | 599d76b | 2011-11-11 19:56:26 +0100 | [diff] [blame] | 42 | shutdown.  The :class:`ThreadingMixIn` class defines an attribute | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 43 | *daemon_threads*, which indicates whether or not the server should wait for | 
| Florent Xicluna | 599d76b | 2011-11-11 19:56:26 +0100 | [diff] [blame] | 44 | thread termination.  You should set the flag explicitly if you would like | 
 | 45 | threads to behave autonomously; the default is :const:`False`, meaning that | 
 | 46 | Python will not exit until all threads created by :class:`ThreadingMixIn` have | 
 | 47 | exited. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 48 |  | 
 | 49 | Server classes have the same external methods and attributes, no matter what | 
| Georg Brandl | fceab5a | 2008-01-19 20:08:23 +0000 | [diff] [blame] | 50 | network protocol they use. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 51 |  | 
 | 52 |  | 
 | 53 | Server Creation Notes | 
 | 54 | --------------------- | 
 | 55 |  | 
 | 56 | There are five classes in an inheritance diagram, four of which represent | 
 | 57 | synchronous servers of four types:: | 
 | 58 |  | 
 | 59 |    +------------+ | 
 | 60 |    | BaseServer | | 
 | 61 |    +------------+ | 
 | 62 |          | | 
 | 63 |          v | 
 | 64 |    +-----------+        +------------------+ | 
 | 65 |    | TCPServer |------->| UnixStreamServer | | 
 | 66 |    +-----------+        +------------------+ | 
 | 67 |          | | 
 | 68 |          v | 
 | 69 |    +-----------+        +--------------------+ | 
 | 70 |    | UDPServer |------->| UnixDatagramServer | | 
 | 71 |    +-----------+        +--------------------+ | 
 | 72 |  | 
 | 73 | Note that :class:`UnixDatagramServer` derives from :class:`UDPServer`, not from | 
 | 74 | :class:`UnixStreamServer` --- the only difference between an IP and a Unix | 
 | 75 | stream server is the address family, which is simply repeated in both Unix | 
 | 76 | server classes. | 
 | 77 |  | 
 | 78 | Forking and threading versions of each type of server can be created using the | 
 | 79 | :class:`ForkingMixIn` and :class:`ThreadingMixIn` mix-in classes.  For instance, | 
 | 80 | a threading UDP server class is created as follows:: | 
 | 81 |  | 
 | 82 |    class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass | 
 | 83 |  | 
 | 84 | The mix-in class must come first, since it overrides a method defined in | 
| Senthil Kumaran | a6bac95 | 2011-07-04 11:28:30 -0700 | [diff] [blame] | 85 | :class:`UDPServer`.  Setting the various attributes also change the | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 86 | behavior of the underlying server mechanism. | 
 | 87 |  | 
 | 88 | To implement a service, you must derive a class from :class:`BaseRequestHandler` | 
 | 89 | and redefine its :meth:`handle` method.  You can then run various versions of | 
 | 90 | the service by combining one of the server classes with your request handler | 
 | 91 | class.  The request handler class must be different for datagram or stream | 
 | 92 | services.  This can be hidden by using the handler subclasses | 
 | 93 | :class:`StreamRequestHandler` or :class:`DatagramRequestHandler`. | 
 | 94 |  | 
 | 95 | Of course, you still have to use your head!  For instance, it makes no sense to | 
 | 96 | use a forking server if the service contains state in memory that can be | 
 | 97 | modified by different requests, since the modifications in the child process | 
 | 98 | would never reach the initial state kept in the parent process and passed to | 
 | 99 | each child.  In this case, you can use a threading server, but you will probably | 
 | 100 | have to use locks to protect the integrity of the shared data. | 
 | 101 |  | 
 | 102 | On the other hand, if you are building an HTTP server where all data is stored | 
 | 103 | externally (for instance, in the file system), a synchronous class will | 
 | 104 | essentially render the service "deaf" while one request is being handled -- | 
 | 105 | which may be for a very long time if a client is slow to receive all the data it | 
 | 106 | has requested.  Here a threading or forking server is appropriate. | 
 | 107 |  | 
 | 108 | In some cases, it may be appropriate to process part of a request synchronously, | 
 | 109 | but to finish processing in a forked child depending on the request data.  This | 
 | 110 | can be implemented by using a synchronous server and doing an explicit fork in | 
 | 111 | the request handler class :meth:`handle` method. | 
 | 112 |  | 
 | 113 | Another approach to handling multiple simultaneous requests in an environment | 
 | 114 | that supports neither threads nor :func:`fork` (or where these are too expensive | 
 | 115 | or inappropriate for the service) is to maintain an explicit table of partially | 
 | 116 | finished requests and to use :func:`select` to decide which request to work on | 
 | 117 | next (or whether to handle a new incoming request).  This is particularly | 
 | 118 | important for stream services where each client can potentially be connected for | 
| Florent Xicluna | 599d76b | 2011-11-11 19:56:26 +0100 | [diff] [blame] | 119 | a long time (if threads or subprocesses cannot be used).  See :mod:`asyncore` | 
 | 120 | for another way to manage this. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 121 |  | 
| Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 122 | .. XXX should data and methods be intermingled, or separate? | 
 | 123 |    how should the distinction between class and instance variables be drawn? | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 124 |  | 
 | 125 |  | 
 | 126 | Server Objects | 
 | 127 | -------------- | 
 | 128 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 129 | .. class:: BaseServer | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 130 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 131 |    This is the superclass of all Server objects in the module.  It defines the | 
 | 132 |    interface, given below, but does not implement most of the methods, which is | 
 | 133 |    done in subclasses. | 
 | 134 |  | 
 | 135 |  | 
 | 136 | .. method:: BaseServer.fileno() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 137 |  | 
 | 138 |    Return an integer file descriptor for the socket on which the server is | 
 | 139 |    listening.  This function is most commonly passed to :func:`select.select`, to | 
 | 140 |    allow monitoring multiple servers in the same process. | 
 | 141 |  | 
 | 142 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 143 | .. method:: BaseServer.handle_request() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 144 |  | 
| Christian Heimes | dd15f6c | 2008-03-16 00:07:10 +0000 | [diff] [blame] | 145 |    Process a single request.  This function calls the following methods in | 
 | 146 |    order: :meth:`get_request`, :meth:`verify_request`, and | 
 | 147 |    :meth:`process_request`.  If the user-provided :meth:`handle` method of the | 
 | 148 |    handler class raises an exception, the server's :meth:`handle_error` method | 
 | 149 |    will be called.  If no request is received within :attr:`self.timeout` | 
 | 150 |    seconds, :meth:`handle_timeout` will be called and :meth:`handle_request` | 
 | 151 |    will return. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 152 |  | 
 | 153 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 154 | .. method:: BaseServer.serve_forever(poll_interval=0.5) | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 155 |  | 
| R David Murray | 258fabe | 2012-10-01 21:43:46 -0400 | [diff] [blame] | 156 |    Handle requests until an explicit :meth:`shutdown` request.  Poll for | 
 | 157 |    shutdown every *poll_interval* seconds. Ignores :attr:`self.timeout`.  It | 
 | 158 |    also calls :meth:`service_actions`, which may be used by a subclass or mixin | 
 | 159 |    to provide actions specific to a given service.  For example, the | 
 | 160 |    :class:`ForkingMixIn` class uses :meth:`service_actions` to clean up zombie | 
 | 161 |    child processes. | 
| Christian Heimes | dd15f6c | 2008-03-16 00:07:10 +0000 | [diff] [blame] | 162 |  | 
| Senthil Kumaran | 5e826e8 | 2011-05-26 00:22:59 +0800 | [diff] [blame] | 163 |    .. versionchanged:: 3.3 | 
| R David Murray | 258fabe | 2012-10-01 21:43:46 -0400 | [diff] [blame] | 164 |        Added ``service_actions`` call to the ``serve_forever`` method. | 
| Senthil Kumaran | 5e826e8 | 2011-05-26 00:22:59 +0800 | [diff] [blame] | 165 |  | 
 | 166 |  | 
 | 167 | .. method:: BaseServer.service_actions() | 
 | 168 |  | 
| R David Murray | 258fabe | 2012-10-01 21:43:46 -0400 | [diff] [blame] | 169 |    This is called in the :meth:`serve_forever` loop. This method is can be | 
 | 170 |    overridden by subclasses or mixin classes to perform actions specific to | 
 | 171 |    a given service, such as cleanup actions. | 
| Senthil Kumaran | 5e826e8 | 2011-05-26 00:22:59 +0800 | [diff] [blame] | 172 |  | 
 | 173 |    .. versionadded:: 3.3 | 
| Christian Heimes | dd15f6c | 2008-03-16 00:07:10 +0000 | [diff] [blame] | 174 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 175 | .. method:: BaseServer.shutdown() | 
| Christian Heimes | dd15f6c | 2008-03-16 00:07:10 +0000 | [diff] [blame] | 176 |  | 
| Sandro Tosi | 753b79c | 2012-01-03 22:35:54 +0100 | [diff] [blame] | 177 |    Tell the :meth:`serve_forever` loop to stop and wait until it does. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 178 |  | 
 | 179 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 180 | .. attribute:: BaseServer.address_family | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 181 |  | 
 | 182 |    The family of protocols to which the server's socket belongs. | 
| Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 183 |    Common examples are :const:`socket.AF_INET` and :const:`socket.AF_UNIX`. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 184 |  | 
 | 185 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 186 | .. attribute:: BaseServer.RequestHandlerClass | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 187 |  | 
 | 188 |    The user-provided request handler class; an instance of this class is created | 
 | 189 |    for each request. | 
 | 190 |  | 
 | 191 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 192 | .. attribute:: BaseServer.server_address | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 193 |  | 
 | 194 |    The address on which the server is listening.  The format of addresses varies | 
 | 195 |    depending on the protocol family; see the documentation for the socket module | 
 | 196 |    for details.  For Internet protocols, this is a tuple containing a string giving | 
 | 197 |    the address, and an integer port number: ``('127.0.0.1', 80)``, for example. | 
 | 198 |  | 
 | 199 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 200 | .. attribute:: BaseServer.socket | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 201 |  | 
 | 202 |    The socket object on which the server will listen for incoming requests. | 
 | 203 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 204 |  | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 205 | The server classes support the following class variables: | 
 | 206 |  | 
| Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 207 | .. XXX should class variables be covered before instance variables, or vice versa? | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 208 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 209 | .. attribute:: BaseServer.allow_reuse_address | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 210 |  | 
| Florent Xicluna | 599d76b | 2011-11-11 19:56:26 +0100 | [diff] [blame] | 211 |    Whether the server will allow the reuse of an address.  This defaults to | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 212 |    :const:`False`, and can be set in subclasses to change the policy. | 
 | 213 |  | 
 | 214 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 215 | .. attribute:: BaseServer.request_queue_size | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 216 |  | 
 | 217 |    The size of the request queue.  If it takes a long time to process a single | 
 | 218 |    request, any requests that arrive while the server is busy are placed into a | 
 | 219 |    queue, up to :attr:`request_queue_size` requests.  Once the queue is full, | 
 | 220 |    further requests from clients will get a "Connection denied" error.  The default | 
 | 221 |    value is usually 5, but this can be overridden by subclasses. | 
 | 222 |  | 
 | 223 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 224 | .. attribute:: BaseServer.socket_type | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 225 |  | 
 | 226 |    The type of socket used by the server; :const:`socket.SOCK_STREAM` and | 
| Alexandre Vassalotti | 5f8ced2 | 2008-05-16 00:03:33 +0000 | [diff] [blame] | 227 |    :const:`socket.SOCK_DGRAM` are two common values. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 228 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 229 |  | 
 | 230 | .. attribute:: BaseServer.timeout | 
| Georg Brandl | fceab5a | 2008-01-19 20:08:23 +0000 | [diff] [blame] | 231 |  | 
| Christian Heimes | dd15f6c | 2008-03-16 00:07:10 +0000 | [diff] [blame] | 232 |    Timeout duration, measured in seconds, or :const:`None` if no timeout is | 
 | 233 |    desired.  If :meth:`handle_request` receives no incoming requests within the | 
 | 234 |    timeout period, the :meth:`handle_timeout` method is called. | 
| Georg Brandl | fceab5a | 2008-01-19 20:08:23 +0000 | [diff] [blame] | 235 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 236 |  | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 237 | There are various server methods that can be overridden by subclasses of base | 
 | 238 | server classes like :class:`TCPServer`; these methods aren't useful to external | 
 | 239 | users of the server object. | 
 | 240 |  | 
| Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 241 | .. XXX should the default implementations of these be documented, or should | 
| Alexandre Vassalotti | ce26195 | 2008-05-12 02:31:37 +0000 | [diff] [blame] | 242 |    it be assumed that the user will look at socketserver.py? | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 243 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 244 | .. method:: BaseServer.finish_request() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 245 |  | 
 | 246 |    Actually processes the request by instantiating :attr:`RequestHandlerClass` and | 
 | 247 |    calling its :meth:`handle` method. | 
 | 248 |  | 
 | 249 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 250 | .. method:: BaseServer.get_request() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 251 |  | 
 | 252 |    Must accept a request from the socket, and return a 2-tuple containing the *new* | 
 | 253 |    socket object to be used to communicate with the client, and the client's | 
 | 254 |    address. | 
 | 255 |  | 
 | 256 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 257 | .. method:: BaseServer.handle_error(request, client_address) | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 258 |  | 
 | 259 |    This function is called if the :attr:`RequestHandlerClass`'s :meth:`handle` | 
 | 260 |    method raises an exception.  The default action is to print the traceback to | 
 | 261 |    standard output and continue handling further requests. | 
 | 262 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 263 |  | 
 | 264 | .. method:: BaseServer.handle_timeout() | 
| Georg Brandl | fceab5a | 2008-01-19 20:08:23 +0000 | [diff] [blame] | 265 |  | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 266 |    This function is called when the :attr:`timeout` attribute has been set to a | 
 | 267 |    value other than :const:`None` and the timeout period has passed with no | 
| Georg Brandl | fceab5a | 2008-01-19 20:08:23 +0000 | [diff] [blame] | 268 |    requests being received.  The default action for forking servers is | 
 | 269 |    to collect the status of any child processes that have exited, while | 
 | 270 |    in threading servers this method does nothing. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 271 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 272 |  | 
 | 273 | .. method:: BaseServer.process_request(request, client_address) | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 274 |  | 
 | 275 |    Calls :meth:`finish_request` to create an instance of the | 
 | 276 |    :attr:`RequestHandlerClass`.  If desired, this function can create a new process | 
 | 277 |    or thread to handle the request; the :class:`ForkingMixIn` and | 
 | 278 |    :class:`ThreadingMixIn` classes do this. | 
 | 279 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 280 |  | 
| Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 281 | .. Is there any point in documenting the following two functions? | 
 | 282 |    What would the purpose of overriding them be: initializing server | 
 | 283 |    instance variables, adding new network families? | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 284 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 285 | .. method:: BaseServer.server_activate() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 286 |  | 
 | 287 |    Called by the server's constructor to activate the server.  The default behavior | 
| Florent Xicluna | 599d76b | 2011-11-11 19:56:26 +0100 | [diff] [blame] | 288 |    just :meth:`listen`\ s to the server's socket.  May be overridden. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 289 |  | 
 | 290 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 291 | .. method:: BaseServer.server_bind() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 292 |  | 
 | 293 |    Called by the server's constructor to bind the socket to the desired address. | 
 | 294 |    May be overridden. | 
 | 295 |  | 
 | 296 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 297 | .. method:: BaseServer.verify_request(request, client_address) | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 298 |  | 
| Florent Xicluna | 599d76b | 2011-11-11 19:56:26 +0100 | [diff] [blame] | 299 |    Must return a Boolean value; if the value is :const:`True`, the request will | 
 | 300 |    be processed, and if it's :const:`False`, the request will be denied.  This | 
 | 301 |    function can be overridden to implement access controls for a server. The | 
 | 302 |    default implementation always returns :const:`True`. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 303 |  | 
 | 304 |  | 
 | 305 | RequestHandler Objects | 
 | 306 | ---------------------- | 
 | 307 |  | 
 | 308 | The request handler class must define a new :meth:`handle` method, and can | 
 | 309 | override any of the following methods.  A new instance is created for each | 
 | 310 | request. | 
 | 311 |  | 
 | 312 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 313 | .. method:: RequestHandler.finish() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 314 |  | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 315 |    Called after the :meth:`handle` method to perform any clean-up actions | 
| Kristján Valur Jónsson | 36852b7 | 2012-12-25 22:46:32 +0000 | [diff] [blame] | 316 |    required.  The default implementation does nothing.  If :meth:`setup` | 
 | 317 |    raises an exception, this function will not be called. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 318 |  | 
 | 319 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 320 | .. method:: RequestHandler.handle() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 321 |  | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 322 |    This function must do all the work required to service a request.  The | 
 | 323 |    default implementation does nothing.  Several instance attributes are | 
 | 324 |    available to it; the request is available as :attr:`self.request`; the client | 
 | 325 |    address as :attr:`self.client_address`; and the server instance as | 
 | 326 |    :attr:`self.server`, in case it needs access to per-server information. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 327 |  | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 328 |    The type of :attr:`self.request` is different for datagram or stream | 
 | 329 |    services.  For stream services, :attr:`self.request` is a socket object; for | 
 | 330 |    datagram services, :attr:`self.request` is a pair of string and socket. | 
 | 331 |    However, this can be hidden by using the request handler subclasses | 
 | 332 |    :class:`StreamRequestHandler` or :class:`DatagramRequestHandler`, which | 
 | 333 |    override the :meth:`setup` and :meth:`finish` methods, and provide | 
 | 334 |    :attr:`self.rfile` and :attr:`self.wfile` attributes.  :attr:`self.rfile` and | 
 | 335 |    :attr:`self.wfile` can be read or written, respectively, to get the request | 
 | 336 |    data or return data to the client. | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 337 |  | 
 | 338 |  | 
| Benjamin Peterson | d23f822 | 2009-04-05 19:13:16 +0000 | [diff] [blame] | 339 | .. method:: RequestHandler.setup() | 
| Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 340 |  | 
 | 341 |    Called before the :meth:`handle` method to perform any initialization actions | 
 | 342 |    required.  The default implementation does nothing. | 
 | 343 |  | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 344 |  | 
 | 345 | Examples | 
 | 346 | -------- | 
 | 347 |  | 
 | 348 | :class:`socketserver.TCPServer` Example | 
 | 349 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 | 350 |  | 
 | 351 | This is the server side:: | 
 | 352 |  | 
 | 353 |    import socketserver | 
 | 354 |  | 
 | 355 |    class MyTCPHandler(socketserver.BaseRequestHandler): | 
 | 356 |        """ | 
 | 357 |        The RequestHandler class for our server. | 
 | 358 |  | 
 | 359 |        It is instantiated once per connection to the server, and must | 
 | 360 |        override the handle() method to implement communication to the | 
 | 361 |        client. | 
 | 362 |        """ | 
 | 363 |  | 
 | 364 |        def handle(self): | 
 | 365 |            # self.request is the TCP socket connected to the client | 
 | 366 |            self.data = self.request.recv(1024).strip() | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 367 |            print("{} wrote:".format(self.client_address[0])) | 
| Benjamin Peterson | 06fd5f8 | 2008-11-08 17:24:34 +0000 | [diff] [blame] | 368 |            print(self.data) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 369 |            # just send back the same data, but upper-cased | 
| Senthil Kumaran | 6e13f13 | 2012-02-09 17:54:17 +0800 | [diff] [blame] | 370 |            self.request.sendall(self.data.upper()) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 371 |  | 
 | 372 |    if __name__ == "__main__": | 
 | 373 |        HOST, PORT = "localhost", 9999 | 
 | 374 |  | 
 | 375 |        # Create the server, binding to localhost on port 9999 | 
 | 376 |        server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) | 
 | 377 |  | 
 | 378 |        # Activate the server; this will keep running until you | 
 | 379 |        # interrupt the program with Ctrl-C | 
 | 380 |        server.serve_forever() | 
 | 381 |  | 
 | 382 | An alternative request handler class that makes use of streams (file-like | 
 | 383 | objects that simplify communication by providing the standard file interface):: | 
 | 384 |  | 
 | 385 |    class MyTCPHandler(socketserver.StreamRequestHandler): | 
 | 386 |  | 
 | 387 |        def handle(self): | 
 | 388 |            # self.rfile is a file-like object created by the handler; | 
 | 389 |            # we can now use e.g. readline() instead of raw recv() calls | 
 | 390 |            self.data = self.rfile.readline().strip() | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 391 |            print("{} wrote:".format(self.client_address[0])) | 
| Benjamin Peterson | 06fd5f8 | 2008-11-08 17:24:34 +0000 | [diff] [blame] | 392 |            print(self.data) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 393 |            # Likewise, self.wfile is a file-like object used to write back | 
 | 394 |            # to the client | 
 | 395 |            self.wfile.write(self.data.upper()) | 
 | 396 |  | 
 | 397 | The difference is that the ``readline()`` call in the second handler will call | 
 | 398 | ``recv()`` multiple times until it encounters a newline character, while the | 
 | 399 | single ``recv()`` call in the first handler will just return what has been sent | 
| Senthil Kumaran | 6e13f13 | 2012-02-09 17:54:17 +0800 | [diff] [blame] | 400 | from the client in one ``sendall()`` call. | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 401 |  | 
 | 402 |  | 
 | 403 | This is the client side:: | 
 | 404 |  | 
 | 405 |    import socket | 
 | 406 |    import sys | 
 | 407 |  | 
 | 408 |    HOST, PORT = "localhost", 9999 | 
 | 409 |    data = " ".join(sys.argv[1:]) | 
 | 410 |  | 
 | 411 |    # Create a socket (SOCK_STREAM means a TCP socket) | 
 | 412 |    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
 | 413 |  | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 414 |    try: | 
 | 415 |        # Connect to server and send data | 
 | 416 |        sock.connect((HOST, PORT)) | 
| Senthil Kumaran | 6e13f13 | 2012-02-09 17:54:17 +0800 | [diff] [blame] | 417 |        sock.sendall(bytes(data + "\n", "utf-8")) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 418 |  | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 419 |        # Receive data from the server and shut down | 
 | 420 |        received = str(sock.recv(1024), "utf-8") | 
 | 421 |    finally: | 
 | 422 |        sock.close() | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 423 |  | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 424 |    print("Sent:     {}".format(data)) | 
 | 425 |    print("Received: {}".format(received)) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 426 |  | 
 | 427 |  | 
 | 428 | The output of the example should look something like this: | 
 | 429 |  | 
 | 430 | Server:: | 
 | 431 |  | 
 | 432 |    $ python TCPServer.py | 
 | 433 |    127.0.0.1 wrote: | 
| Benjamin Peterson | 06fd5f8 | 2008-11-08 17:24:34 +0000 | [diff] [blame] | 434 |    b'hello world with TCP' | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 435 |    127.0.0.1 wrote: | 
| Benjamin Peterson | 06fd5f8 | 2008-11-08 17:24:34 +0000 | [diff] [blame] | 436 |    b'python is nice' | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 437 |  | 
 | 438 | Client:: | 
 | 439 |  | 
 | 440 |    $ python TCPClient.py hello world with TCP | 
 | 441 |    Sent:     hello world with TCP | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 442 |    Received: HELLO WORLD WITH TCP | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 443 |    $ python TCPClient.py python is nice | 
 | 444 |    Sent:     python is nice | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 445 |    Received: PYTHON IS NICE | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 446 |  | 
 | 447 |  | 
 | 448 | :class:`socketserver.UDPServer` Example | 
 | 449 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 | 450 |  | 
 | 451 | This is the server side:: | 
 | 452 |  | 
 | 453 |    import socketserver | 
 | 454 |  | 
 | 455 |    class MyUDPHandler(socketserver.BaseRequestHandler): | 
 | 456 |        """ | 
 | 457 |        This class works similar to the TCP handler class, except that | 
 | 458 |        self.request consists of a pair of data and client socket, and since | 
 | 459 |        there is no connection the client address must be given explicitly | 
 | 460 |        when sending data back via sendto(). | 
 | 461 |        """ | 
 | 462 |  | 
 | 463 |        def handle(self): | 
 | 464 |            data = self.request[0].strip() | 
 | 465 |            socket = self.request[1] | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 466 |            print("{} wrote:".format(self.client_address[0])) | 
| Benjamin Peterson | 06fd5f8 | 2008-11-08 17:24:34 +0000 | [diff] [blame] | 467 |            print(data) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 468 |            socket.sendto(data.upper(), self.client_address) | 
 | 469 |  | 
 | 470 |    if __name__ == "__main__": | 
| Benjamin Peterson | 2021100 | 2009-11-25 18:34:42 +0000 | [diff] [blame] | 471 |        HOST, PORT = "localhost", 9999 | 
 | 472 |        server = socketserver.UDPServer((HOST, PORT), MyUDPHandler) | 
 | 473 |        server.serve_forever() | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 474 |  | 
 | 475 | This is the client side:: | 
 | 476 |  | 
 | 477 |    import socket | 
 | 478 |    import sys | 
 | 479 |  | 
| Benjamin Peterson | 06fd5f8 | 2008-11-08 17:24:34 +0000 | [diff] [blame] | 480 |    HOST, PORT = "localhost", 9999 | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 481 |    data = " ".join(sys.argv[1:]) | 
 | 482 |  | 
 | 483 |    # SOCK_DGRAM is the socket type to use for UDP sockets | 
 | 484 |    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | 
 | 485 |  | 
 | 486 |    # As you can see, there is no connect() call; UDP has no connections. | 
 | 487 |    # Instead, data is directly sent to the recipient via sendto(). | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 488 |    sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT)) | 
 | 489 |    received = str(sock.recv(1024), "utf-8") | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 490 |  | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 491 |    print("Sent:     {}".format(data)) | 
 | 492 |    print("Received: {}".format(received)) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 493 |  | 
 | 494 | The output of the example should look exactly like for the TCP server example. | 
 | 495 |  | 
 | 496 |  | 
 | 497 | Asynchronous Mixins | 
 | 498 | ~~~~~~~~~~~~~~~~~~~ | 
 | 499 |  | 
 | 500 | To build asynchronous handlers, use the :class:`ThreadingMixIn` and | 
 | 501 | :class:`ForkingMixIn` classes. | 
 | 502 |  | 
 | 503 | An example for the :class:`ThreadingMixIn` class:: | 
 | 504 |  | 
 | 505 |    import socket | 
 | 506 |    import threading | 
 | 507 |    import socketserver | 
 | 508 |  | 
 | 509 |    class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): | 
 | 510 |  | 
 | 511 |        def handle(self): | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 512 |            data = str(self.request.recv(1024), 'ascii') | 
| Georg Brandl | f992640 | 2008-06-13 06:32:25 +0000 | [diff] [blame] | 513 |            cur_thread = threading.current_thread() | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 514 |            response = bytes("{}: {}".format(cur_thread.name, data), 'ascii') | 
| Senthil Kumaran | 6e13f13 | 2012-02-09 17:54:17 +0800 | [diff] [blame] | 515 |            self.request.sendall(response) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 516 |  | 
 | 517 |    class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): | 
 | 518 |        pass | 
 | 519 |  | 
 | 520 |    def client(ip, port, message): | 
 | 521 |        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
 | 522 |        sock.connect((ip, port)) | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 523 |        try: | 
| Senthil Kumaran | 6e13f13 | 2012-02-09 17:54:17 +0800 | [diff] [blame] | 524 |            sock.sendall(bytes(message, 'ascii')) | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 525 |            response = str(sock.recv(1024), 'ascii') | 
 | 526 |            print("Received: {}".format(response)) | 
 | 527 |        finally: | 
 | 528 |            sock.close() | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 529 |  | 
 | 530 |    if __name__ == "__main__": | 
 | 531 |        # Port 0 means to select an arbitrary unused port | 
 | 532 |        HOST, PORT = "localhost", 0 | 
 | 533 |  | 
 | 534 |        server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) | 
 | 535 |        ip, port = server.server_address | 
 | 536 |  | 
 | 537 |        # Start a thread with the server -- that thread will then start one | 
 | 538 |        # more thread for each request | 
 | 539 |        server_thread = threading.Thread(target=server.serve_forever) | 
 | 540 |        # Exit the server thread when the main thread terminates | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 541 |        server_thread.daemon = True | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 542 |        server_thread.start() | 
| Benjamin Peterson | d75fcb4 | 2009-02-19 04:22:03 +0000 | [diff] [blame] | 543 |        print("Server loop running in thread:", server_thread.name) | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 544 |  | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 545 |        client(ip, port, "Hello World 1") | 
 | 546 |        client(ip, port, "Hello World 2") | 
 | 547 |        client(ip, port, "Hello World 3") | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 548 |  | 
 | 549 |        server.shutdown() | 
 | 550 |  | 
| Benjamin Peterson | 06fd5f8 | 2008-11-08 17:24:34 +0000 | [diff] [blame] | 551 |  | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 552 | The output of the example should look something like this:: | 
 | 553 |  | 
 | 554 |    $ python ThreadedTCPServer.py | 
 | 555 |    Server loop running in thread: Thread-1 | 
| Florent Xicluna | 023611f | 2011-10-23 22:40:37 +0200 | [diff] [blame] | 556 |    Received: Thread-2: Hello World 1 | 
 | 557 |    Received: Thread-3: Hello World 2 | 
 | 558 |    Received: Thread-4: Hello World 3 | 
| Georg Brandl | b533e26 | 2008-05-25 18:19:30 +0000 | [diff] [blame] | 559 |  | 
 | 560 |  | 
 | 561 | The :class:`ForkingMixIn` class is used in the same way, except that the server | 
 | 562 | will spawn a new process for each request. |