阅读(4492) (0)

Tornado 各种网络应用程序

2022-03-10 09:10:52 更新

tornado.netutil.bind_sockets(port: int, address: Optional[str] = None, family: socket.AddressFamily = <AddressFamily.AF_UNSPEC: 0>, backlog: int = 128, flags: Optional[int] = None, reuse_port: bool = False) → List[socket.socket]

创建绑定到给定端口和地址的侦听套接字。

返回套接字对象的列表(如果给定地址映射到多个 IP 地址,则返回多个套接字,这对于混合使用 IPv4 和 IPv6 最常见)。

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

backlog参数与 ​socket.listen()的含义相同。

flags是 ​getaddrinfo的 AI_* 标志位掩码,如 ​socket.AI_PASSIVE | socket.AI_NUMERICHOST

reuse_port​选项为列表中的每个套接字设置 ​SO_REUSEPORT ​选项。 如果您的平台不支持此选项,则会引发 ValueError。

tornado.netutil.bind_unix_socket(file: str, mode: int = 384, backlog: int = 128) → socket.socket

创建一个监听 unix 套接字。

如果具有给定名称的套接字已经存在,它将被删除。 如果存在具有该名称的任何其他文件,则会引发异常。

返回一个套接字对象(不是像 ​bind_sockets这样的套接字对象列表)

tornado.netutil.add_accept_handler(sock: socket.socket, callback: Callable[[socket.socket, Any], None]) → Callable[[], None]

添加 ​IOLoop事件处理程序以接受 ​sock上的新连接。

当一个连接被接受时,​callback(connection, address)​会被运行(​connection​是一个​socket​对象,​address​是连接另一端的地址)。 请注意,此签名与用于 ​IOLoop处理程序的回调​(fd,events)​签名不同。

返回一个可调用对象,调用该可调用对象时,将删除 ​IOLoop事件处理程序并停止处理进一步的传入连接。

在 5.0 版中更改: ​io_loop ​参数(自 4.1 版以来已弃用)已被删除。

在 5.0 版更改:返回一个可调用对象(之前没有返回)。

tornado.netutil.is_valid_ip(ip: str) → bool

如果给定的字符串是格式正确的 IP 地址,则返回 ​True​。

支持 IPv4 和 IPv6。

class tornado.netutil.Resolver

可配置的异步 DNS 解析器接口。

默认情况下,使用阻塞实现(简单地调用 ​socket.getaddrinfo​)。 可以使用 ​Resolver.configure​ 类方法选择替代实现:

Resolver.configure('tornado.netutil.ThreadedResolver')

Tornado 包含的这个接口的实现是

  • tornado.netutil.DefaultExecutorResolver
  • tornado.netutil.BlockingResolver​(已弃用)
  • tornado.netutil.ThreadedResolver​(已弃用)
  • tornado.netutil.OverrideResolver
  • tornado.platform.twisted.TwistedResolver
  • tornado.platform.caresresolver.CaresResolver

在 5.0 版更改: 默认实现已从 ​BlockingResolver更改为 ​DefaultExecutorResolver​。

resolve(host: str, port: int, family: socket.AddressFamily = <AddressFamily.AF_UNSPEC: 0>) → Awaitable[List[Tuple[int, Any]]]

解析地址。

host参数是一个字符串,可以是主机名或文字 IP 地址。

返回一个 ​Future​,其结果是 (family, address) 对的列表,其中 address 是一个适合传递给 ​socket.connect​ 的元组(即 IPv4 的 ​(host, port)​ 对;IPv6 可能存在其他字段)。 如果传递了回调,它将在完成时将结果作为参数运行。

引发:​IOError ​– 如果地址无法解析。

在 4.4 版更改:标准化所有实现以引发 ​IOError​。

在 6.0 版更改: 回调参数已删除。 请改用返回的可等待对象。

close() → None

关闭解析器,释放所有使用的资源。

class tornado.netutil.DefaultExecutorResolver

使用 ​IOLoop.run_in_executor​ 的解析器实现。

class tornado.netutil.ExecutorResolver

使用 ​concurrent.futures.Executor​ 的解析器实现。

当您需要对正在使用的执行器进行额外控制时,请使用它而不是 ​ThreadedResolver​。

除非​close_resolver=False​,否则当​resolver​关闭时​executor​会被关闭; 如果您想在其他地方重用相同的执行器,请使用它。

在 5.0 版中更改: ​io_loop ​参数(自 4.1 版以来已弃用)已被删除。

5.0 版后已弃用:默认解析器现在使用 ​IOLoop.run_in_executor​; 使用它而不是此类。

class tornado.netutil.BlockingResolver

默认解析器实现,使用 ​socket.getaddrinfo​。

IOLoop将在解析期间被阻止,尽管回调将在下一次 ​IOLoop迭代之前运行。

5.0 版后已弃用:默认解析器现在使用 ​IOLoop.run_in_executor​; 使用它而不是此类。

class tornado.netutil.ThreadedResolver

多线程非阻塞解析器实现。

需要安装 ​concurrent.futures​ 包(自 Python 3.2 起在标准库中可用,可在旧版本中使用 ​pip install futures​ 安装)。

线程池大小可以配置为:

Resolver.configure('tornado.netutil.ThreadedResolver',
                   num_threads=10)

在 3.1 版更改: 所有 ​ThreadedResolver共享一个线程池,其大小由要创建的第一个设置。

5.0 版后已弃用:默认解析器现在使用 ​IOLoop.run_in_executor​; 使用它而不是此类。

class tornado.netutil.OverrideResolver

使用覆盖映射包装解析器。

这可用于进行本地 DNS 更改(例如用于测试),而无需修改系统范围的设置。

映射可以是三种格式:

{
    # Hostname to host or ip
    "example.com": "127.0.1.1",

    # Host+port to host+port
    ("login.example.com", 443): ("localhost", 1443),

    # Host+port+address family to host+port
    ("login.example.com", 443, socket.AF_INET6): ("::1", 1443),
}

在 5.0 版更改: 添加了对主机端口系列三元组的支持。

tornado.netutil.ssl_options_to_context(ssl_options: Union[Dict[str, Any], ssl.SSLContext]) → ssl.SSLContext

尝试将 ​ssl_options字典转换为 ​SSLContext对象。

ssl_options字典包含要传递给 ​ssl.wrap_socket​ 的关键字。 在 Python 2.7.9+ 中,可以改用 ​ssl.SSLContext​ 对象。 此函数将dict表单转换为其 ​SSLContext等效项,并且可以在接受这两种表单的组件需要升级到 ​SSLContext ​版本以使用 ​SNI或 ​NPN等功能时使用。

tornado.netutil.ssl_wrap_socket(socket: socket.socket, ssl_options: Union[Dict[str, Any], ssl.SSLContext], server_hostname: Optional[str] = None, **kwargs) → ssl.SSLSocket

返回包装给定套接字的ssl.SSLSocket​。

ssl_options可以是​ssl.SSLContext​ 对象或字典(由 ​ssl_options_to_context​ 接受)。 额外的关键字参数被传递给 ​wrap_socket​(​SSLContext方法或 ​ssl模块函数,视情况而定)。