1. 关键步骤
- 服务器端:
- 创建事件循环:使用
asyncio.get_running_loop()
获取事件循环对象,这是asyncio
实现事件驱动的基础,它负责管理和调度异步任务。
- 创建服务器:通过
asyncio.start_server()
函数创建一个服务器实例,该函数接受处理客户端连接的回调函数作为参数。
- 注册回调:定义一个异步函数作为处理客户端连接的回调,在这个函数中处理客户端的消息接收和发送。
- 启动服务器:使用
await
关键字等待服务器启动,并通过serve_forever()
方法使服务器持续运行,监听客户端连接。
- 客户端端:
- 创建事件循环:同样使用
asyncio.get_running_loop()
获取事件循环。
- 建立连接:通过
asyncio.open_connection()
函数创建与服务器的连接,获取读写流对象。
- 消息收发:使用读写流对象的
write()
方法发送消息,使用readline()
等方法接收消息。
- 关闭连接:完成消息收发后,关闭读写流并停止事件循环。
2. 代码框架
服务器端代码框架
import asyncio
async def handle_connection(reader, writer):
while True:
# 接收客户端消息
data = await reader.readline()
if not data:
break
message = data.decode('utf - 8').strip()
print(f"Received from client: {message}")
# 向客户端发送响应
response = f"Message received: {message}"
writer.write(response.encode('utf - 8'))
await writer.drain()
async def main():
server = await asyncio.start_server(handle_connection, '127.0.0.1', 8888)
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())
客户端端代码框架
import asyncio
async def send_message():
reader, writer = await asyncio.open_connection('127.0.0.1', 8888)
message = "Hello, server!"
writer.write(message.encode('utf - 8'))
await writer.drain()
data = await reader.readline()
response = data.decode('utf - 8').strip()
print(f"Received from server: {response}")
writer.close()
await writer.wait_closed()
if __name__ == "__main__":
asyncio.run(send_message())