# RPC(服务端 / 客户端)
## 服务端
注册服务名与 API handler,然后启动:
```rust,no_run
use std::sync::Arc;
use unitree_sdk2_rs::rpc::RpcServer;
#[tokio::main]
async fn main() {
unitree_sdk2_rs::init_dds(0, "eth0", "");
let server = Arc::new(RpcServer::new("rpc_test").expect("创建 RpcServer 失败"));
server.register_handler(1001, |req| format!(r#"{{"echo":"{}"}}"#, req));
server.register_handler(1002, |_| r#"{"result":"ok"}"#.to_string());
eprintln!("RPC 服务端启动中 (rpc_test, api=1001,1002)");
server.clone().start().await;
}
```
## 客户端
```rust,no_run
use unitree_sdk2_rs::rpc::RpcClient;
#[tokio::main]
async fn main() {
unitree_sdk2_rs::init_dds(0, "eth0", "");
let client = RpcClient::new("rpc_test").expect("创建 RpcClient 失败");
client.register_api(1001);
client.register_api(1002);
let resp = client.call(1001, "hello".to_string()).await.expect("call 1001");
println!("api=1001 code={} data={}", resp.code, resp.data);
let resp = client.call(1002, String::new()).await.expect("call 1002");
println!("api=1002 code={} data={}", resp.code, resp.data);
}
```
> `call` 在 blocking 线程池执行,不阻塞当前任务;返回 `RpcResponse { code, data }`(JSON 反序列化)。