MST

星途 面试题库

面试题:网络编程中事件驱动模型在实时系统里如何实现基础通信

请阐述在实时系统的网络编程场景下,如何利用事件驱动模型实现简单的客户端与服务器之间的消息收发,例如使用Python的asyncio库,描述关键步骤和代码框架。
42.0万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

1. 关键步骤

  1. 服务器端
    • 创建事件循环:使用asyncio.get_running_loop()获取事件循环对象,这是asyncio实现事件驱动的基础,它负责管理和调度异步任务。
    • 创建服务器:通过asyncio.start_server()函数创建一个服务器实例,该函数接受处理客户端连接的回调函数作为参数。
    • 注册回调:定义一个异步函数作为处理客户端连接的回调,在这个函数中处理客户端的消息接收和发送。
    • 启动服务器:使用await关键字等待服务器启动,并通过serve_forever()方法使服务器持续运行,监听客户端连接。
  2. 客户端端
    • 创建事件循环:同样使用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())