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

1. 说明

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

2. 接口说明

python 复制代码
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() # 判断连接是否是断开状态

3. 简单案例

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

python 复制代码
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')

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

相关推荐
星期天要睡觉3 分钟前
深度学习——基于 ResNet18 的图像分类训练
pytorch·python·机器学习
Dovis(誓平步青云)4 分钟前
《简易制作 Linux Shell:详细分析原理、设计与实践》
linux·运维·服务器
林炳然4 分钟前
Python-Basic Day-1 基本元素(数字、字符串)
python
weixin_307779136 分钟前
在Linux服务器上使用Jenkins和Poetry实现Python项目自动化
linux·开发语言·python·自动化·jenkins
今天没有盐8 分钟前
内置基础类型之布尔值类型(bool)与时间与日期类型
python·编程语言
Empty_77711 分钟前
Python编程之常用模块
开发语言·网络·python
wheeldown24 分钟前
【Linux】Linux 进程通信:System V 共享内存(最快方案)C++ 封装实战 + 通信案例,4 类经典 Bug 快速修复
linux·运维·服务器·开发语言
Q_Q51100828536 分钟前
python+uniapp基于微信小程序的学院设备报修系统
spring boot·python·微信小程序·django·flask·uni-app
蓝色空白的博客1 小时前
自动化测试脚本-->集成测试部署思路整理(1)
python·集成测试
Blossom.1181 小时前
把AI“绣”进丝绸:生成式刺绣神经网络让古装自带摄像头
人工智能·pytorch·python·深度学习·神经网络·机器学习·fpga开发