File manager - Edit - /usr/local/CyberCP/lib/python3.10/site-packages/tornado/__pycache__/tcpserver.cpython-310.pyc
Back
o �h�: � @ s� d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl m Z ddlmZm Z ddlmZmZmZmZ ddlmZ dd lmZ ddlZdd lmZmZmZmZmZmZ ejrcddlmZmZ G dd � d e �Z!dS )z+A non-blocking, single-threaded TCP server.� N)�gen)�app_log)�IOLoop)�IOStream�SSLIOStream)�bind_sockets�add_accept_handler�ssl_wrap_socket�_DEFAULT_BACKLOG)�process)�errno_from_exception)�Union�Dict�Any�Iterable�Optional� Awaitable)�Callable�Listc @ sZ e Zd ZdZ d'deeeeef e j f dee dee ddfdd�Zde jedd fd edee de jd edee deddfdd�Zdee j ddfdd�Zde j ddfdd�Zde jedd fd edee de jd edee deddfdd�Z d(dee dee ddfdd�Zd)dd �Zd!ededeed fd"d#�Zd$e j deddfd%d&�ZdS )*� TCPServeraN A non-blocking, single-threaded TCP server. To use `TCPServer`, define a subclass which overrides the `handle_stream` method. For example, a simple echo server could be defined like this:: from tornado.tcpserver import TCPServer from tornado.iostream import StreamClosedError class EchoServer(TCPServer): async def handle_stream(self, stream, address): while True: try: data = await stream.read_until(b"\n") await stream.write(data) except StreamClosedError: break To make this server serve SSL traffic, send the ``ssl_options`` keyword argument with an `ssl.SSLContext` object. For compatibility with older versions of Python ``ssl_options`` may also be a dictionary of keyword arguments for the `ssl.SSLContext.wrap_socket` method.:: ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_ctx.load_cert_chain(os.path.join(data_dir, "mydomain.crt"), os.path.join(data_dir, "mydomain.key")) TCPServer(ssl_options=ssl_ctx) `TCPServer` initialization follows one of three patterns: 1. `listen`: single-process:: async def main(): server = TCPServer() server.listen(8888) await asyncio.Event.wait() asyncio.run(main()) While this example does not create multiple processes on its own, when the ``reuse_port=True`` argument is passed to ``listen()`` you can run the program multiple times to create a multi-process service. 2. `add_sockets`: multi-process:: sockets = bind_sockets(8888) tornado.process.fork_processes(0) async def post_fork_main(): server = TCPServer() server.add_sockets(sockets) await asyncio.Event().wait() asyncio.run(post_fork_main()) The `add_sockets` interface is more complicated, but it can be used with `tornado.process.fork_processes` to run a multi-process service with all worker processes forked from a single parent. `add_sockets` can also be used in single-process servers if you want to create your listening sockets in some way other than `~tornado.netutil.bind_sockets`. Note that when using this pattern, nothing that touches the event loop can be run before ``fork_processes``. 3. `bind`/`start`: simple **deprecated** multi-process:: server = TCPServer() server.bind(8888) server.start(0) # Forks multiple sub-processes IOLoop.current().start() This pattern is deprecated because it requires interfaces in the `asyncio` module that have been deprecated since Python 3.10. Support for creating multiple processes in the ``start`` method will be removed in a future version of Tornado. .. versionadded:: 3.1 The ``max_buffer_size`` argument. .. versionchanged:: 5.0 The ``io_loop`` argument has been removed. N�ssl_options�max_buffer_size�read_chunk_size�returnc C s� || _ i | _i | _g | _d| _d| _|| _|| _| j d urUt| j t �rWd| j vr,t d��tj� | j d �s>td| j d ��d| j v rYtj� | j d �s[td| j d ��d S d S d S d S )NF�certfilez%missing key "certfile" in ssl_optionszcertfile "%s" does not exist�keyfilezkeyfile "%s" does not exist)r �_sockets� _handlers�_pending_sockets�_started�_stoppedr r � isinstance�dict�KeyError�os�path�exists� ValueError)�selfr r r � r) �D/usr/local/CyberCP/lib/python3.10/site-packages/tornado/tcpserver.py�__init__| s. ���� zTCPServer.__init__F�port�address�family�backlog�flags� reuse_portc C s"