#r-socket #transport #unix-domain-socket #rsocket #tokio #server #client

rsocket_rust_transport_unix

Unix 域套接字 RSocket 传输实现

1 个不稳定版本

0.5.3 2020 年 6 月 11 日

#4#rsocket

Apache-2.0 协议

160KB
4.5K SLoC

RSocket 传输针对 Unix 域套接字

示例

在您的 Cargo.toml 中添加依赖项。

[dependencies]
tokio = "0.2.21"
rsocket_rust = "0.5.3"
rsocket_rust_transport_unix = "0.5.3"

服务器

use log::info;
use rsocket_rust::prelude::{EchoRSocket, RSocketFactory, ServerResponder};
use rsocket_rust_transport_unix::UnixServerTransport;
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {

    let transport: UnixServerTransport = UnixServerTransport::from("/tmp/rsocket-uds.sock");

    let responder: ServerResponder = Box::new(|setup, _socket| {
        info!("accept setup: {:?}", setup);
        Ok(Box::new(EchoRSocket))
        // Or you can reject setup
        // Err(From::from("SETUP_NOT_ALLOW"))
    });

    let on_start: Box<dyn FnMut() + Send + Sync> =
        Box::new(|| info!("+++++++ echo server started! +++++++"));

    RSocketFactory::receive()
        .transport(transport)
        .acceptor(responder)
        .on_start(on_start)
        .serve()
        .await?;

    Ok(())
}

客户端

use log::info;
use rsocket_rust::prelude::{ClientResponder, EchoRSocket, Payload, RSocket, RSocketFactory};
use rsocket_rust_transport_unix::UnixClientTransport;
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
    
    let responder: ClientResponder = Box::new(|| Box::new(EchoRSocket));

    let client = RSocketFactory::connect()
        .acceptor(responder)
        .transport(UnixClientTransport::from("/tmp/rsocket-uds.sock"))
        .setup(Payload::from("READY!"))
        .mime_type("text/plain", "text/plain")
        .start()
        .await
        .unwrap();

    let request_payload: Payload = Payload::builder()
        .set_data_utf8("Hello World!")
        .set_metadata_utf8("Rust")
        .build();

    let res = client.request_response(request_payload).await.unwrap();

    info!("got: {:?}", res);

    client.close();

    Ok(())
}

依赖项

~5.5MB
~84K SLoC