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


    1. 说明

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

    2. 接口说明

    1. asyncio.start_server(callback,ip,port) # 生成一个异步服务器,调用后会自动传给回调函数两个参数writer和reader
    	callback: 回调函数,异步操作均在此函数中执行
    	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() # 判断连接是否是断开状态
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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() # 等待套接字完全关闭
                return
            print("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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

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

  • 相关阅读:
    《SprigBoot篇》09.Spring Data JPA简介与SpringBoot整合超详细教学
    Shell编程之函数与数组
    ZooKeeper之Java API的基本使用以及应用场景的实现
    飞象星球落地重庆云阳86所学校,县乡4万学生迎来素质课堂
    VGG网络详解(实现猫猫和狗狗识别)
    哈工大李治军老师操作系统笔记【13】:一个实际的schedule函数(Learning OS Concepts By Coding Them !)
    javascript-立即执行函数
    力扣每日一题:754. 到达终点数字【数学题】
    C++遴选出特定类型的文件或文件名符合要求的文件
    windows server批量创建用户
  • 原文地址:https://blog.csdn.net/FY_13781298928/article/details/133747112