#sockets #server #tokio #abstraction #stream #client #interface

multistream

为 tokio 中的 tcp/tls/unix 套接字服务器和客户端提供简单抽象

1 个不稳定版本

0.1.0 2022年4月27日

#180#sockets


kredis 使用

MIT 许可证

13KB
199

多流

多流创建了一个跨明文 TCP、TLS 加密 TCP 和 UNIX 套接字的通用套接字流客户端/服务器接口。

以下是示例中的主要文件:示例

客户端示例

use anyhow::Result;

use multistream::Client;

const HTTP_REQUEST: &[u8] = b"GET / HTTP/1.1\r\nHost: suchprogramming.com\r\n\r\n";
// const REDIS_REQUEST: &[u8] = b"PING\r\n";

#[tokio::main]
pub async fn main() -> Result<()> {

    // Will use TLS unless given tcp://, unix:// or other handled prefixes
    let mut client = Client::connect("suchprogramming.com:443").await?;
    // let mut client = Client::connect("tls://suchprogramming.com:443").await?; # Same as above
    // let mut client = Client::connect("tcp://suchprogramming:80").await?;

    client.send(HTTP_REQUEST).await?;

    loop {
        let buffer = client.recv().await?;
        let html = std::str::from_utf8(&buffer).unwrap();
        print!("{}", html);
        if html.contains("</html>") {
            return Ok(());
        }
    }

    /*

    // Or for redis via unix socket
    let mut client = Client::connect("unix:///var/run/redis/redis-server.sock").await?;

    client.send(REDIS_REQUEST).await?;
    let buffer = client.recv().await?;
    println!("{:?}", std::str::from_utf8(&buffer).unwrap());
    Ok(())

    */
}

服务器示例

use anyhow::Result;

use multistream::{Server, CertAndKeyFilePaths};

const RESPONSE: &[u8] = b"HTTP/1.1 200 OK\r\nServer: a very great server\r\n\r\n";

#[tokio::main]
pub async fn main() -> Result<()> {
    let cert_and_key = CertAndKeyFilePaths::new("cert.pem", "privkey.pem");
    let mut server = Server::listen("0.0.0.0:8443", Some(cert_and_key)).await?;

    let mut client = server.accept().await?;

    let buffer = client.recv().await?;
    println!("{:#?}", std::str::from_utf8(&buffer)?);
    client.send(RESPONSE).await?;

    Ok(())
}

依赖项

~12–24MB
~426K SLoC