DNS服务进行交互
应用程序使用网络与服务器通信以进行域名服务(DNS)操作,例如在主机名和IP地址之间进行转换。asyncio在事件循环上有方便的方法来处理后台的这些操作,以避免在查询过程中被阻塞。
按名称查询地址
使用协程getaddrinfo()将主机名和端口号转换为IP或IPv6地址。与socket模块中函数的版本一样,返回值是包含五条信息的元组列表。
- 1.地址家族
- 2.地址类型
- 3.协议
- 4.服务器的规范名称
- 5.一个socket地址元组,适用于在最初指定的端口上打开到服务器的连接
查询可以按协议进行过滤,如本示例中所示,只返回TCP响应。12345678910111213141516171819202122import asyncioimport loggingimport socketimport sysTARGETS = [('pymotw.com', 'https'),('doughellmann.com', 'https'),('python.org', 'https'),]async def main(loop, targets):for target in targets:info = await loop.getaddrinfo(*target, proto=socket.IPPROTO_TCP,)for host in info:print('{:20}: {}'.format(target[0], host[4][0]))event_loop = asyncio.get_event_loop()try:event_loop.run_until_complete(main(event_loop, TARGETS))finally:event_loop.close()
示例程序将主机名和协议名称转换为IP地址和端口号。
按地址查询名称
协程getnameinfo()工作方向则相反,在可能的情况下将IP地址转换为主机名和端口号为协议名称。
此示例显示pymotw.com的IP地址是位于运行站点的托管公司DreamHost上的服务器。查询的第二个IP地址是python.org,它不会解析回主机名。
本文翻译自《The Python3 Standard Library By Example》asyncio相关章节