# Unique9-SE **Repository Path**: software-engineering-pre-project/unique9-se ## Basic Information - **Project Name**: Unique9-SE - **Description**: Unique9-SEproject - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-05 - **Last Updated**: 2025-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python ## README # 双向聊天服务 (FastAPI + uv) 两个独立的 FastAPI 服务 (A / B),运行在不同端口 (8000 / 8001),通过 HTTP 调用互相发送文本消息,实现最简双向“聊天”。 ## 技术栈 - Python 3.13 (.python-version 固定) - FastAPI (lifespan 生命周期管理) - httpx (服务间通信) - uv (依赖与运行管理) ## 目录结构 ``` . ├── pyproject.toml ├── uv.lock ├── README.md └── src ├── app_a.py # 服务A (127.0.0.1:8000) ├── app_b.py # 服务B (127.0.0.1:8001) └── utils └── response.py ``` ## 安装 uv ## 安装依赖 ```bash uv sync ``` ## 启动服务 分别开启两个终端: 终端1(启动 A): ```bash uv run python src/app_a.py ``` 终端2(启动 B): ```bash uv run python src/app_b.py ``` 说明: - 若先启动的一端提示“等待对方服务启动...”,属正常。 - 当双方都显示“已就绪,输入 exit 退出”即可互发消息。 ## 发送与接收 输入: ``` A > 你好 ``` 另一端显示: ``` 收到来自 A 的消息: 你好 ``` ## 退出方式对比 | 操作 | 作用 | 是否还能接收消息 | |------|------|------------------| | 输入 exit | 退出本端输入循环,HTTP 服务仍在 | 可以 | | Ctrl + C | 停止该服务进程 | 不可以 | | 两端都 Ctrl + C | 全部停止 | 否 | 重新进入输入循环的方法:结束进程后重新启动脚本。 ## 接口说明 | 方法 | 路径 | 说明 | |------|------|------| | GET | /info | 返回本服务名称 | | POST | /receive | 接收对方消息并打印 | 统一响应结构: ```json { "code": 200, "message": "success", "data": { ... } } ``` ## 运行方式(可选 uvicorn 命令) ```bash uv run uvicorn src.app_a:app --host 127.0.0.1 --port 8000 uv run uvicorn src.app_b:app --host 127.0.0.1 --port 8001 ``` ## 常见问题 | 问题 | 解决 | |------|------| | 一直显示等待对方服务 | 另一端未启动或端口占用 | | 发送失败 | 对端未运行 / 端口冲突 | | 端口被占用 | Windows: netstat -ano | findstr :8000 | | 改端口 | 修改 app_a.py / app_b.py 内 uvicorn.run 的 port | ## 设计要点 - 使用 lifespan 替代传统 @app.on_event - chat_loop 通过 asyncio.create_task 后台运行 - input 使用 asyncio.to_thread 避免阻塞事件循环 - 不持久化消息,不保证重发/可靠性 ## 扩展建议 - 改为 WebSocket 长连接 - 增加消息时间戳 / 历史列表 - 加启动脚本(同时拉起 A/B) - 加健康检查 / 心跳 ## 许可证 学习示例,自由使用与修改。