13个版本 (2个稳定版)

1.0.1 2024年3月21日
0.6.0 2024年3月20日
0.5.0 2023年12月28日

#10 in #数据传输


用于 2 crate

MIT/Apache

110KB
1K SLoC

Tcp-Handler

Crate GitHub last commit GitHub issues GitHub pull requests GitHub

用其他语言阅读: 英文简体中文

描述

更方便地使用tokio::net::TcpStream来传输bytes::Bytes数据块。

您可以使用额外的crate来读取和写入数据,例如serdepostcardvariable-len-reader

查看tcp-servertcp-client以方便地构建您的TCP应用程序。

特性

  • 基于tokiobytes
  • 支持ReadHalfWriteHalftokio::net::TcpStream。(实际上任何实现了AsyncRead/AsyncWriteUnpin的都可以使用。)
  • 支持bytes::Buf。因此,您可以通过调用chain来发送不连续的数据块。
  • 支持加密(rsaaes)。
  • 支持压缩(flate2)。
  • 完整的API文档和数据模型。

用法

将其添加到您的Cargo.toml

[dependencies]
tcp-handler = "^1.0"

注意

如果使用加密模式进行client_init在调试模式下非常慢,请在客户端的Cargo.toml中添加此内容

[profile.dev.package.num-bigint-dig]
opt-level = 3 # Speed up rsa key gen.

这是rsa crate中的一个问题

示例

使用 TcpHandler,您可以以类似的方式使用所有协议。

use anyhow::{Error, Result};
use bytes::{Buf, BufMut, BytesMut};
use tcp_handler::raw::*;
use tokio::{spawn, try_join};
use tokio::net::{TcpListener, TcpStream};
use variable_len_reader::{VariableReader, VariableWriter};

#[tokio::main]
async fn main() -> Result<()> {
    // Create tcp stream.
    let server = TcpListener::bind("localhost:0").await?;
    let mut client = TcpStream::connect(server.local_addr()?).await?;
    let (mut server, _) = server.accept().await?;
    
    let client = spawn(async move {
        let mut client = TcpClientHandlerRaw::from_stream(client, "YourApplication", "1.0.0").await?;

        // Send.
        let mut writer = BytesMut::new().writer();
        writer.write_string("hello server.")?;
        client.send(&mut writer.into_inner()).await?;
      
        Ok::<_, Error>(())
    });
    let server = spawn(async move {
        let mut server = TcpServerHandlerRaw::from_stream(server, "YourApplication", |v| v == "1.0.0", "1.0.0").await?;
        assert_eq!(server.get_client_version(), "1.0.0");

        // Receive.
        let mut reader = server.recv().await?.reader();
        let res = reader.read_string()?;
        assert_eq!(res, "hello server.");

        Ok::<_, Error>(())
    });
    try_join!(client, server)?;
    Ok(())
}

协议版本

内部使用的协议版本代码。注意,只有当服务器和客户端的代码相同时,它们才能正常连接。

crate 版本 协议版本
>=0.6.0 1
<0.6.0 0

许可证

许可方式为以下之一

任选其一。

依赖关系

~3–14MB
~171K SLoC