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初始化遵循以下三种模式之一:listen:简单单进程:server = TCPServer() server.listen(8888) IOLoop.current().start()
bind/开始:简单多进程::server = TCPServer() server.bind(8888) server.start(0) # Forks multiple sub-processes IOLoop.current().start()
使用此接口时,
IOLoop必须 not 传给TCPServer建造师。start将始终在默认单例上启动服务器IOLoop.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作为快捷方式bind和start电话。地址可以是IP地址或主机名。如果是主机名,服务器将监听与该名称相关联的所有IP地址。地址可以是空字符串,也可以是在所有可用接口上侦听的无字符串。家庭可以设置为
socket.AF_INET或socket.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.Application当debug=True)当使用多个进程时,在调用TCPServer.start(n).价值观
num_processesWindows上不支持1以外的。这个
max_restarts参数传递给fork_processes.在 6.0 版更改: 补充
max_restarts参数。
- 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 版更改: 已将此方法的选项添加为协程。