tornado.tcpserver ---基本 IOStream -基于TCP服务器

一个非阻塞的单线程TCP服务器。

class tornado.tcpserver.TCPServer(ssl_options: Optional[Union[Dict[str, Any], ssl.SSLContext]] = None, max_buffer_size: Optional[int] = None, read_chunk_size: Optional[int] = None)[源代码]

一个非阻塞的单线程TCP服务器。

使用 TCPServer ,定义重写 handle_stream 方法。例如,可以这样定义一个简单的echo服务器:

from tornado.tcpserver import TCPServer
from tornado.iostream import StreamClosedError
from tornado import gen

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

要使此服务器提供SSL通信,请发送 ssl_options 关键字参数 ssl.SSLContext 对象。与旧版本的python兼容 ssl_options 也可以是关键字参数的字典 ssl.wrap_socket 方法::

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 初始化遵循以下三种模式之一:

  1. listen :简单单进程:

    server = TCPServer()
    server.listen(8888)
    IOLoop.current().start()
    
  2. bind /开始:简单多进程::

    server = TCPServer()
    server.bind(8888)
    server.start(0)  # Forks multiple sub-processes
    IOLoop.current().start()
    

    使用此接口时, IOLoop 必须 not 传给 TCPServer 建造师。 start 将始终在默认单例上启动服务器 IOLoop .

  3. add_sockets :高级多进程:

    sockets = bind_sockets(8888)
    tornado.process.fork_processes(0)
    server = TCPServer()
    server.add_sockets(sockets)
    IOLoop.current().start()
    

    这个 add_sockets 接口更复杂,但可以与 tornado.process.fork_processes 当叉子出现时给你更多的灵活性。 add_sockets 如果您希望以其他方式创建侦听套接字,也可以在单进程服务器中使用 bind_sockets .

3.1 新版功能: 这个 max_buffer_size 参数。

在 5.0 版更改: 这个 io_loop 参数已删除。

listen(port: int, address: str = '') None[源代码]

开始接受给定端口上的连接。

可以多次调用此方法来侦听多个端口。 listen 立即生效;无需呼叫 TCPServer.start 之后。然而,有必要启动 IOLoop .

add_sockets(sockets: Iterable[socket.socket]) None[源代码]

使此服务器开始接受给定套接字上的连接。

这个 sockets 参数是套接字对象的列表,例如 bind_sockets . add_sockets 通常与该方法和 tornado.process.fork_processes 对多进程服务器的初始化提供更大的控制。

add_socket(socket: socket.socket) None[源代码]

的单数形式 add_sockets . 获取单个套接字对象。

bind(port: int, address: Optional[str] = None, family: socket.AddressFamily = AddressFamily.AF_UNSPEC, backlog: int = 128, reuse_port: bool = False) None[源代码]

将此服务器绑定到给定地址上的给定端口。

要启动服务器,请调用 start . 如果要在单个进程中运行此服务器,可以调用 listen 作为快捷方式 bindstart 电话。

地址可以是IP地址或主机名。如果是主机名,服务器将监听与该名称相关联的所有IP地址。地址可以是空字符串,也可以是在所有可用接口上侦听的无字符串。家庭可以设置为 socket.AF_INETsocket.AF_INET6 限制到IPv4或IPv6地址,否则,如果可用,将同时使用这两个地址。

这个 backlog 论点的含义与for相同 socket.listen . 这个 reuse_port 论点的含义与for相同 bind_sockets .

此方法可以在 start 监听多个端口或接口。

在 4.4 版更改: 增加了 reuse_port 参数。

start(num_processes: Optional[int] = 1, max_restarts: Optional[int] = None) None[源代码]

在中启动此服务器 IOLoop .

默认情况下,我们在此进程中运行服务器,而不复刻任何其他子进程。

如果num_进程是 None 或者<=0,我们检测这台机器上可用的核心数量,并复刻子进程的数量。如果给定num_进程且>1,我们将派生出特定数量的子进程。

因为我们使用进程而不是线程,所以任何服务器代码之间都没有共享内存。

请注意,多个进程与自动加载模块(或 autoreload=True 选择权 tornado.web.Applicationdebug=True )当使用多个进程时,在调用 TCPServer.start(n) .

价值观 num_processes Windows上不支持1以外的。

这个 max_restarts 参数传递给 fork_processes .

在 6.0 版更改: 补充 max_restarts 参数。

stop() None[源代码]

停止侦听新连接。

服务器停止后,当前正在进行的请求仍可能继续。

handle_stream(stream: tornado.iostream.IOStream, address: tuple) Optional[Awaitable[None]][源代码]

重写以处理新的 IOStream 来自传入连接。

此方法可能是协同程序;如果是,则会记录异步引发的任何异常。接受传入连接不会被此协程阻塞。

如果这样 TCPServer 是为SSL配置的, handle_stream 可以在SSL握手完成之前调用。使用 SSLIOStream.wait_for_handshake 如果您需要验证客户的证书或使用NPN/ALPN。

在 4.2 版更改: 已将此方法的选项添加为协程。