首页 > 编程 > Python > 正文

探索Python3.4中新引入的asyncio模块

2020-02-23 00:35:01
字体:
来源:转载
供稿:网友

使用 Simple Protocol

asyncio.BaseProtocol 类是asyncio模块中协议接口(protocol interface)的一个常见的基类。asyncio.Protocolclass 继承自asyncio.BaseProtocol 并为stream protocols提供了一个接口。下面的代码演示了asyncio.Protocol 接口的一个简单实现,它的行为1就像一个echo server,同时,它还会在Python的控制台中输出一些信息。SimpleEchoProtocol 继承自asyncio.Protocol,并且实现了3个方法:connection_made, data_received 以及 andconnection_lost:

import asyncio class SimpleEchoProtocol(asyncio.Protocol):  def connection_made(self, transport):    """    Called when a connection is made.    The argument is the transport representing the pipe connection.    To receive data, wait for data_received() calls.    When the connection is closed, connection_lost() is called.    """    print("Connection received!")    self.transport = transport   def data_received(self, data):    """    Called when some data is received.    The argument is a bytes object.    """    print(data)    self.transport.write(b'echo:')    self.transport.write(data)   def connection_lost(self, exc):    """    Called when the connection is lost or closed.    The argument is an exception object or None (the latter    meaning a regular EOF is received or the connection was    aborted or closed).    """    print("Connection lost! Closing server...")    server.close() loop = asyncio.get_event_loop()server = loop.run_until_complete(loop.create_server(SimpleEchoProtocol, 'localhost', 2222))loop.run_until_complete(server.wait_closed())

你可以通过运行一个telnet客户端程序,并且连接到localhost的2222端口来测试这个echo server。如果你正在使用这个端口,你可以将这个端口号修改为任何其他可以使用的端口。如果你使用默认的值,你可以在Python的控制台中运行上面的代码,之后在命令提示符或终端中运行 telnet localhost 2222。你将会看到 Connection received! 的信息显示在Python的控制台中。接下来,你在telnet的控制台中输入的任何字符都会以echo:跟上输入的字符的形式展示出来,同时,在Python的控制台中会显示出刚才新输入的字符。当你退出telnet控制台时,你会看到Connection lost! Closing server... 的信息展示在Python的控制台中。

举个例子,如果你在开启telnet之后输入 abc,你将会在telnet的窗口中看到下面的消息:

 echo:abecho:bcecho:c

此外,在Python的控制台中会显示下面的消息:

 Connection received! b'a' b'b' b'c' Connection lost! Closing server...

在创建了一个名为loop的事件循环之后,代码将会调用loop.run_until_complete来运行loop.create_server这个协程(coroutine)。这个协程创建了一个TCP服务器并使用protocol的工厂类绑定到指定主机的指定端口(在这个例子中是localhost上的2222端口,使用的工厂类是SimpleEchoProtocol)并返回一个Server的对象,以便用来停止服务。代码将这个实例赋值给server变量。用这种方式,当建立一个客户端连接时,会创建一个新的SimpleEchoProtocol的实例并且该类中的方法会被执行。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表