116 行
4.1 KiB
Markdown
116 行
4.1 KiB
Markdown
# TCP Server & Client (Python)
|
||
|
||
一个基于 Python 标准库 `socket` 实现的轻量级 TCP 通信示例项目,包含服务端和交互式客户端。
|
||
|
||
适合用于:
|
||
|
||
- 学习 TCP Socket 编程的基础流程
|
||
- 本地调试网络程序、验证端口连通性
|
||
- 作为其他 TCP 服务(如 Netty、自定义协议)的简易测试客户端
|
||
|
||
> ⚠️ 本项目仅用于学习和测试,未做并发处理、鉴权及安全防护,请勿直接用于生产环境。
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
tcp_server/
|
||
├── tcp_server.py # TCP 服务端:监听端口、接收消息并返回确认
|
||
├── tcp_test.py # TCP 客户端:交互式发送消息、接收服务端响应
|
||
└── README.md # 项目文档
|
||
```
|
||
|
||
## 环境要求
|
||
|
||
- Python 3.6+(仅使用标准库,无需安装第三方依赖)
|
||
|
||
## 快速开始
|
||
|
||
### 1. 启动服务端
|
||
|
||
打开一个终端,运行服务端(默认监听 `0.0.0.0:30008`):
|
||
|
||
```bash
|
||
python tcp_server.py
|
||
```
|
||
|
||
启动成功后会看到:
|
||
|
||
```
|
||
🚀 服务器正在监听 0.0.0.0:30008 ...
|
||
等待客户端连接...
|
||
```
|
||
|
||
### 2. 启动客户端
|
||
|
||
另开一个终端,运行客户端并输入消息:
|
||
|
||
```bash
|
||
python tcp_test.py
|
||
```
|
||
|
||
```
|
||
正在尝试连接到 127.0.0.1:30008 ...
|
||
✅ 连接成功!请输入要发送的消息(输入 'exit' 退出):
|
||
我: hello
|
||
📤 消息已发送。
|
||
📥 服务器响应: 服务器已收到: hello
|
||
我: exit
|
||
正在断开连接...
|
||
```
|
||
|
||
### 3. 本机自测
|
||
|
||
如果服务端和客户端在同一台机器,客户端默认连接 `127.0.0.1:30008` 即可。
|
||
跨机器测试时,请将 `tcp_test.py` 中的 `HOST` 改为服务端的实际 IP。
|
||
|
||
## 配置说明
|
||
|
||
### 服务端 `tcp_server.py`
|
||
|
||
| 参数 | 默认值 | 说明 |
|
||
| ------- | ----------- | -------------------------------------- |
|
||
| `HOST` | `'0.0.0.0'` | 监听地址,`0.0.0.0` 表示接受所有接口 |
|
||
| `PORT` | `30008` | 监听端口,需与客户端保持一致 |
|
||
|
||
### 客户端 `tcp_test.py`
|
||
|
||
| 参数 | 默认值 | 说明 |
|
||
| ------- | ------------- | --------------------------------------------- |
|
||
| `HOST` | `'127.0.0.1'` | 服务端 IP,跨机测试请改为实际地址 |
|
||
| `PORT` | `30008` | 服务端端口,需与服务端保持一致 |
|
||
|
||
## 实现要点
|
||
|
||
### 服务端(`tcp_server.py`)
|
||
|
||
1. 创建 TCP Socket:`socket(AF_INET, SOCK_STREAM)`
|
||
2. 设置 `SO_REUSEADDR`,避免服务重启后端口处于 `TIME_WAIT` 导致绑定失败
|
||
3. `bind` 绑定地址,`listen(5)` 开始监听连接队列
|
||
4. 主循环不断 `accept` 新连接,每接受一个连接就创建一个守护线程 `handle_client` 处理,从而**支持并发多客户端**
|
||
5. 每个连接线程内循环 `recv(1024)` 接收数据,空数据表示客户端断开;收到消息后回送 `服务器已收到: <消息>`
|
||
6. 支持 `Ctrl+C` 优雅关闭;`finally` 中确保关闭监听套接字
|
||
|
||
> 使用 `threading.Thread(daemon=True)`,主线程退出时子线程会自动结束,便于调试与退出。
|
||
|
||
### 客户端(`tcp_test.py`)
|
||
|
||
1. 创建 TCP Socket 并 `connect` 到服务端
|
||
2. 通过 `input()` 循环读取用户输入并 `sendall` 发送(末尾追加 `\n`)
|
||
3. 发送后设置 5 秒超时等待服务端响应,超时或空响应均给出提示
|
||
4. 输入 `exit` 退出;任何情况下都在 `finally` 中关闭套接字
|
||
|
||
## 常见问题
|
||
|
||
**Q: 客户端提示 `ConnectionRefusedError`?**
|
||
A: 确认服务端已启动、端口一致,且防火墙未拦截该端口。
|
||
|
||
**Q: 服务端只处理一个连接?**
|
||
A: 已支持并发。服务端采用多线程模型(`threading`),每接受一个客户端连接就启动一个守护线程独立处理,可同时服务多个客户端。监听队列 `backlog` 设为 5,高并发长连接场景可结合连接池或 `selectors`/`asyncio` 进一步优化。
|
||
|
||
**Q: 可以和 Java Netty 等服务端互通吗?**
|
||
A: 客户端发送以 `\n` 结尾的消息,可对接按行分隔(如 `LineBasedFrameDecoder`)的协议方;服务端的回送逻辑为简单的 echo 确认。
|
||
|
||
## License
|
||
|
||
MIT
|