1个不稳定版本
0.1.2 | 2023年11月25日 |
---|---|
0.1.1 |
|
0.1.0 |
|
#2051 in 编码
12KB
200 行
prost-stream
从Stream中读取protobuf消息
示例
Stream
use prost_stream::Stream;
use std::net::TcpListener;
use std::net::TcpStream;
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Ping {
#[prost(uint64, tag = "1")]
pub id: u64,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Pong {
#[prost(uint64, tag = "1")]
pub id: u64,
}
fn main() -> anyhow::Result<()> {
let listener = TcpListener::bind("127.0.0.1:0")?;
let addr = listener.local_addr()?;
std::thread::spawn(move || {
let (stream, _) = listener.accept()?;
let mut stream = Stream::new(stream);
let _msg: Ping = stream.recv()?;
stream.send(&Pong::default())?;
anyhow::Result::<()>::Ok(())
});
let client = TcpStream::connect(addr)?;
let mut client = Stream::new(client);
client.send(&Ping::default())?;
let pong: Pong = client.recv()?;
assert_eq!(pong, Pong::default());
Ok(())
}
AsyncStream
启用async
特性后,您可以使用AsyncStream
use prost_stream::AsyncStream;
use tokio::net::TcpListener;
use tokio::net::TcpStream;
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Ping {
#[prost(uint64, tag = "1")]
pub id: u64,
}
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Pong {
#[prost(uint64, tag = "1")]
pub id: u64,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let listener = TcpListener::bind("127.0.0.1:0").await?;
let addr = listener.local_addr()?;
tokio::spawn(async move {
let (stream, _) = listener.accept().await?;
let mut stream = AsyncStream::new(stream);
let _msg: Ping = stream.recv().await?;
stream.send(&Pong::default()).await?;
anyhow::Result::<()>::Ok(())
});
let client = TcpStream::connect(addr).await?;
let mut client = AsyncStream::new(client);
client.send(&Ping::default()).await?;
let pong: Pong = client.recv().await?;
assert_eq!(pong, Pong::default());
Ok(())
}
依赖项
~0.5–2.2MB
~42K SLoC