当前位置: 首页 > news >正文

6. Python使用Asyncio开发TCP服务器简单案例

1. 说明

在Python中开发TCP/IP服务器有两种方式,一种使用Socket,需要在py文件中引入对应的socket包,这种方式只能执行单项任务;另一种方式使用Asyncio异步编程,可以一次创建多个服务器执行不同的任务。

2. 接口说明

1. asyncio.start_server(callback,ip,port) # 生成一个异步服务器,调用后会自动传给回调函数两个参数writer和readercallback: 回调函数,异步操作均在此函数中执行ip: ip地址,可以为空,表明接受任意ip的连接port: 端口号
2. serve_forever() # 循环执行,接受连接,直到协程被取消
3. asyncio.wait_for(func,time) # 等待执行func: 等待执行结束的函数time: 等待时间,可以为None表示无限等待
4. writer.write() # 向客户端发送数据
5. writer.drain() # 发送数据后用于清空套接字,需要和writer.write()一起使用
6. reader.read() # 从客户端读取数据
7. writer.close() # 关闭套接字(同时会关闭协程和当前的服务器)
8. writer.wait_closed() # 等待套接字完全关闭,需要和writer.close()一起使用
9. writer.is_closing() # 判断连接是否是断开状态

3. 简单案例

创建一个tcp服务器,并实现数据的接受和发送

from datetime import datetime
import asyncio# 服务器的回调函数
async def script_handle(reader, writer): # reader和writer参数是asyncio.start_server生成异步服务器后自动传入进来的while True: # 循环接受数据,直到套接字关闭# wait_for等待读取数据,第二个参数为等待时间(None表示无限等待)data = await asyncio.wait_for(reader.read(2**10), None)if not data:print('script client disconnected')writer.close() # 关闭套接字await writer.wait_closed() # 等待套接字完全关闭returnprint("received data: ", data.decode())writer.write(data.encode()) # 发送数据await writer.drain() # 发送数据后,清空套接字# 主函数
async def main():# 生成一个服务器server = await asyncio.start_server(script_handle,host='',port=8888)# 获取请求连接的客户端信息addr = server.sockets[0].getsockname()print(f'Serving on {addr}')# 处理多个请求,永远执行着调用async with server:await server.serve_forever()if __name__ == '__main__':try:asyncio.run(main())except KeyboardInterrupt:print(datetime.now().strftime('%Y/%m/%d %H:%M:%S.%f'),'script server exit by key')

运行此脚本即可接受客户端的正常连接和信息传输。

http://www.lryc.cn/news/188013.html

相关文章:

  • 景联文科技:AI大模型强势赋能,助力自动驾驶迭代升级
  • 多周期CPU设计
  • Go 复合类型之字典类型介绍
  • 对于无法直接获取URL的数据爬虫
  • 35.树与二叉树练习(1)(王道第5章综合练习)
  • JSON数据处理工具-在线工具箱网站tool.qqmu.com的使用指南
  • leetcode:190. 颠倒二进制位
  • Spring Cloud--@RefreshScope动态刷新的注意事项
  • visual-studio-code通过跳板机连接远程服务器的配置操作
  • LuatOS-SOC接口文档(air780E)-- gpio - GPIO操作
  • 一个命令让redis服务端所有信息无所遁形~(收藏吃灰系列)
  • 通过Node.js获取高德的省市区数据并插入数据库
  • 记一次 .NET某账本软件 非托管泄露分析
  • Oracle笔记-对ROWNUM的一次理解(简单分页)
  • 系统架构设计:10 论数据湖技术及其应用
  • 【MySQL】基本查询(三)聚合函数+group by
  • 基于KubeAdm搭建多节点K8S集群
  • VuePress实现自动获取文章侧边栏目录功能
  • nginx配置实例-负载均衡
  • Nginx的跨域问题解决
  • ts的交叉类型是什么
  • 【【萌新的SOC学习之AXI接口简介】】
  • ios safari 浏览器跳转页面没有自适应
  • node、npm、nvm相关概念区别
  • Dubbo3应用开发—Dubbo3注册中心(zookeeper、nacos、consul)的使用
  • Chrome自动播放限制策略
  • k8s安全机制
  • Java多线程:Runnable与Callable的区别和原理
  • 解决yolo无法指定显卡的问题,实测v5、v7、v8有效
  • arc 166 a