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_processes
Windows上不支持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 版更改: 已将此方法的选项添加为协程。