• 罗杰
    2021-11-01
    Protobuf 和二进制数据解析都是我一直在寻找的,非常赞

    作者回复: 👍

    
    4
  • dva
    2021-11-29
    试着做一下思考题 use anyhow::Result; use async_prost::AsyncProstStream; use futures::prelude::*; use kv1::{CommandRequest, CommandResponse, Service, ServiceInner, SledDb}; use tokio::net::TcpListener; use tracing::info; use bytes::Bytes; use futures::{SinkExt, StreamExt}; use tokio_util::codec::{Framed, LengthDelimitedCodec}; use prost::Message; #[tokio::main] async fn main() -> Result<()> { tracing_subscriber::fmt::init(); let service: Service<SledDb> = ServiceInner::new(SledDb::new("/tmp/kvserver")) .fn_before_send(|res| match res.message.as_ref() { "" => res.message = "altered. Original message is empty.".into(), s => res.message = format!("altered: {}", s), }) .into(); let addr = "127.0.0.1:9527"; let listener = TcpListener::bind(addr).await?; loop { let (stream, addr) = listener.accept().await?; println!("accepted: {:?}", addr); // LengthDelimitedCodec 默认 4 字节长度 let mut stream = Framed::new(stream, LengthDelimitedCodec::new()); let svc = service.clone(); tokio::spawn(async move { // 接收到的消息会只包含消息主体(不包含长度) while let Some(Ok(data)) = stream.next().await { let cmd = CommandRequest::decode(data).unwrap(); info!("req: {:?} ", cmd); let res = svc.execute(cmd); info!("res: {:?} ", res); stream.send(Bytes::from(res.encode_to_vec())).await.unwrap(); } }); } }
    展开

    作者回复: 👍

    
    1
  • springXu
    2021-11-02
    请教要实现socks5的服务程序,您建议用什么库?为什么推荐这个?

    作者回复: 没有尝试过,你可以在 crates.io 中查找:https://crates.io/keywords/socks5。然后看看各自的使用情况,更新情况。一般我会考虑和已有生态结合更好的,更新频繁,github/gitlab 高赞的库。对于小众的库我会简单对比尝试一下是否满足需求,甚至会根据需要简单浏览一下源代码。

    共 2 条评论
    1
  • 进击的Lancelot
    2022-09-16 来自广东
    思考题可以参考 dva 同学的实现,我这里也提供一个关于 client 的修改: ```rust use anyhow::Result; use bytes::Bytes; use futures::prelude::*; use kv::CommandRequest; use prost::Message; use tokio::net::TcpStream; use tokio_util::codec::{Framed, LengthDelimitedCodec}; use tracing::info; #[tokio::main] async fn main() -> Result<()> { tracing_subscriber::fmt().init(); let addr = "127.0.0.1:9527"; let stream = TcpStream::connect(addr).await?; let mut client = Framed::new(stream, LengthDelimitedCodec::new()); let cmd = CommandRequest::new_hset("table1", "hello", "world".into()); client.send(Bytes::from(cmd.encode_to_vec())).await?; if let Some(Ok(data)) = client.next().await { info!("Got response: {:?}", data); } Ok(()) } ```
    展开
    
    3
  • 贱猴🐔哥的室友
    2022-10-10 来自美国
    之前以为protobuf必须和grpc等一起用比较好,发现自定义的格式其实跟 TLV(Type-Length-Value)是一样的原理,而且更简单,这种方式应该比较好
    
    