Skip to main content

tornado.tcpserver —基于 IOStream 的基本TCP服务器

非阻塞,单线程TCP服务器。

class tornado.tcpserver.TCPServer(io_loop=None, ssl_options=None, max_buffer_size=None, read_chunk_size=None)[源代码]

非阻塞,单线程TCP服务器。

要使用 TCPServer,请定义覆盖 handle_stream 方法的子类。

要使此服务器提供SSL流量,请使用 ssl.SSLContext 对象发送 ssl_options 关键字参数。为了与旧版本的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/start:简单的多进程:

    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 一起使用,以在叉发生时给您更多的灵活性。如果要以除 bind_sockets 之外的某种方式创建侦听套接字,add_sockets 也可以用于单进程服务器。

3.1 新版功能: max_buffer_size 参数。

listen(port, address='')[源代码]

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

此方法可以被多次调用以在多个端口上侦听。 listen 立即生效;没有必要之后调用 TCPServer.start。然而,有必要启动 IOLoop

add_sockets(sockets)[源代码]

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

sockets 参数是诸如由 bind_sockets 返回的套接字对象的列表。 add_sockets 通常与该方法和 tornado.process.fork_processes 结合使用,以提供对多进程服务器的初始化的更大控制。

add_socket(socket)[源代码]

add_sockets 的单数版本。获取单个套接字对象。

bind(port, address=None, family=0, backlog=128, reuse_port=False)[源代码]

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

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

地址可以是IP地址或主机名。如果它是主机名,则服务器将侦听与该名称关联的所有IP地址。地址可以是空字符串,也可以是无在所有可用接口上侦听。系列可以设置为 socket.AF_INETsocket.AF_INET6 以限制IPv4或IPv6地址,否则将使用两者(如果可用)。

backlog 参数具有与 socket.listen 相同的含义。 reuse_port 参数具有与 bind_sockets 相同的含义。

此方法可以在 start 之前多次调用以在多个端口或接口上侦听。

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

start(num_processes=1)[源代码]

IOLoop 中启动此服务器。

默认情况下,我们在此进程中运行服务器,并且不分叉任何其他子进程。

如果num_processes是 None 或<= 0,我们检测此机器上可用的核心数,并分叉子进程数。如果给出num_processes并且大于1,我们分叉该特定数量的子进程。

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

请注意,多个进程与autoreload模块(或 tornado.web.Applicationautoreload=True 选项,debug=True 时默认为True)不兼容。当使用多个进程时,直到调用 TCPServer.start(n) 之后才能创建或引用IOLoop。

stop()[源代码]

停止侦听新连接。

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

handle_stream(stream, address)[源代码]

覆盖以处理来自传入连接的新 IOStream

该方法可以是协同程序;如果是这样,任何异常引发异步将被记录。接受传入连接不会被此协同程序阻止。

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

在 4.2 版更改: 添加了此方法的选项为协同程序。