rpi-server
TCP JSONL server for rpi with streaming subscriptions — 基于 Transport trait 抽象,支持多种传输协议。
特性
- ✅ TCP JSONL 协议 — 简单、高效、易于调试
- ✅ Transport trait 抽象 — 可扩展 WebSocket/Unix Socket 等传输方式
- ✅ 流式订阅 — 通过
subscribe方法订阅实时事件流 - ✅ 会话管理 — 支持多个 rpi 会话并行
- ✅ 连接管理 — 内置重试、心跳、延迟检测、在线状态追踪
- ✅ 标准化 — JSON-RPC 2.0 消息格式,跨语言兼容
架构
┌─────────────────────────────────────────┐
│ Transport trait │
│ ┌─────────────────────────────────┐ │
│ │ TcpTransport (已实现) │ │
│ │ - TCP JSONL 协议 │ │
│ │ - 服务间通信首选 │ │
│ └─────────────────────────────────┘ │
│ ┌─────────────────────────────────┐ │
│ │ WebSocketTransport (未来) │ │
│ │ - 浏览器/Web 客户端 │ │
│ │ - HTTP 升级协议 │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ ManagedConnection │
│ - 自动重试(最多 10 次) │
│ - 心跳检测(30s 间隔) │
│ - 延迟测量 │
│ - 在线状态追踪 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ AppState + Sessions │
│ - 会话生命周期管理 │
│ - 子进程管理 │
│ - 事件广播 │
└─────────────────────────────────────────┘
安装
使用方式
独立运行
# 启动服务器(默认 127.0.0.1:9800)
# 无 TUI 模式(明确指定)
# 指定端口
# 传递 rpi 参数
作为 rpi 插件
// 启动服务器
// 响应
客户端连接
使用任何 TCP 客户端连接到服务器,发送 JSON-RPC 2.0 格式的请求:
# 使用 nc 测试
# 发送启动会话请求
}}
# 响应
}}}
使用 ManagedConnection(推荐)
use Arc;
use ;
let transport = new;
let conn = new;
// 自动重试连接(最多 10 次)
conn.connect_with_retry.await?;
// 发送请求
conn.send.await?;
// 接收响应
if let Some = conn.recv.await?
// 获取连接状态
let status = conn.status.await;
println!;
// 启动心跳(在独立 task 中)
let conn_clone = conn.clone;
spawn;
JSON-RPC 方法
start_session
启动新的 rpi 会话。
响应:
send
向会话发送命令。
subscribe
订阅会话的事件流(流式响应)。
响应:
后续事件流:
stop_session
停止会话。
list_sessions
列出所有会话。
server_status
获取服务器状态。
ping
心跳检测。
响应:
跨语言客户端
由于使用标准 JSON-RPC 2.0 over TCP,可以用任何语言调用:
Python
=
# 发送请求
=
# 接收响应
= b
=
break
+=
, =
=
break
Node.js
const net = require;
const client = ;
client.;
client.;
Transport trait 扩展
要添加新的传输协议(如 WebSocket),只需实现 Transport 和 Connection trait:
use async_trait;
use ;
然后在 run_server 中使用:
let transport = new;
run_server.await?;
连接管理
ManagedConnection 提供以下功能:
自动重试
// 连接失败时自动重试,最多 10 次,间隔递增
conn.connect_with_retry.await?;
心跳检测
// 启动心跳任务(30s 间隔)
let conn_clone = conn.clone;
spawn;
状态追踪
let status = conn.status.await;
println!;
println!;
println!;
println!;
性能
- TCP JSONL 比 WebSocket 少一层协议开销,但需要自己处理消息边界(
\n) - broadcast channel 支持多个订阅者同时接收事件
- 异步 I/O — 基于 tokio,高并发性能优秀
- 零拷贝 — 消息直接序列化到 TCP 流,无中间缓冲
与 WebSocket 对比
| 特性 | TCP JSONL | WebSocket |
|---|---|---|
| 协议开销 | 低(仅 \n 分隔) |
中(帧协议) |
| 浏览器支持 | ❌ 需要代理 | ✅ 原生支持 |
| 调试难度 | 低(nc/telnet) | 中(需要工具) |
| 心跳检测 | 应用层实现 | 协议自带 |
| 适用场景 | 服务间通信 | Web 客户端 |
License
MIT