WebSocket server returned by :func:`serve`. This class mirrors the API of :class:`~socketserver.BaseServer`, notably the :meth:`~socketserver.BaseServer.serve_forever` and :meth:`~socketserver.BaseServer.shutdown` methods, as well as the context manager protocol. Args:
| 215 | |
| 216 | |
| 217 | class Server: |
| 218 | """ |
| 219 | WebSocket server returned by :func:`serve`. |
| 220 | |
| 221 | This class mirrors the API of :class:`~socketserver.BaseServer`, notably the |
| 222 | :meth:`~socketserver.BaseServer.serve_forever` and |
| 223 | :meth:`~socketserver.BaseServer.shutdown` methods, as well as the context |
| 224 | manager protocol. |
| 225 | |
| 226 | Args: |
| 227 | socket: Server socket listening for new connections. |
| 228 | handler: Handler for one connection. Receives the socket and address |
| 229 | returned by :meth:`~socket.socket.accept`. |
| 230 | logger: Logger for this server. |
| 231 | It defaults to ``logging.getLogger("websockets.server")``. |
| 232 | See the :doc:`logging guide <../../topics/logging>` for details. |
| 233 | |
| 234 | """ |
| 235 | |
| 236 | def __init__( |
| 237 | self, |
| 238 | socket: socket.socket, |
| 239 | handler: Callable[[socket.socket, Any], None], |
| 240 | logger: LoggerLike | None = None, |
| 241 | ) -> None: |
| 242 | self.socket = socket |
| 243 | self.handler = handler |
| 244 | if logger is None: |
| 245 | logger = logging.getLogger("websockets.server") |
| 246 | self.logger = logger |
| 247 | if sys.platform != "win32": |
| 248 | self.shutdown_watcher, self.shutdown_notifier = os.pipe() |
| 249 | |
| 250 | def serve_forever(self) -> None: |
| 251 | """ |
| 252 | See :meth:`socketserver.BaseServer.serve_forever`. |
| 253 | |
| 254 | This method doesn't return. Calling :meth:`shutdown` from another thread |
| 255 | stops the server. |
| 256 | |
| 257 | Typical use:: |
| 258 | |
| 259 | with serve(...) as server: |
| 260 | server.serve_forever() |
| 261 | |
| 262 | """ |
| 263 | poller = selectors.DefaultSelector() |
| 264 | try: |
| 265 | poller.register(self.socket, selectors.EVENT_READ) |
| 266 | except ValueError: # pragma: no cover |
| 267 | # If shutdown() is called before poller.register(), |
| 268 | # the socket is closed and poller.register() raises |
| 269 | # ValueError: Invalid file descriptor: -1 |
| 270 | return |
| 271 | if sys.platform != "win32": |
| 272 | poller.register(self.shutdown_watcher, selectors.EVENT_READ) |
| 273 | |
| 274 | while True: |
no outgoing calls
no test coverage detected
searching dependent graphs…