#channel #io-stream #stream #async-io #networking #server #client

无 std channels

基于泛型 Read/Write 流的双向通道式通信

27 个版本

0.12.4 2024年7月12日
0.11.2 2024年2月18日
0.11.0 2023年12月29日
0.10.0 2023年8月30日
0.1.1 2022年7月23日

网络编程 类别中排名 #528

Download history 131/week @ 2024-06-04 142/week @ 2024-06-11 153/week @ 2024-06-18 150/week @ 2024-06-25 19/week @ 2024-07-02 98/week @ 2024-07-09 8/week @ 2024-07-16 85/week @ 2024-07-30

每月下载量 98

MIT 许可证

185KB
4.5K SLoC

logo

在进程、线程和系统之间实现简单快速通信。

license-badge tests-badge version-badge docs-badge downloads-badge


提供发送器/接收器类型,用于通过泛型 IO 流与类似通道的 API 进行通信。它将序列化、反序列化和传输数据的负担从您的肩上卸下,让您专注于项目的关键逻辑。它是

  • 快速:简单的协议允许低开销的数据传输。

  • 模块化:通道的 sans-io 方法意味着它可以用在任何介质上,无论是网络套接字、管道、共享内存区域、文件,还是任何其他东西。

  • 人体工程学:提供的 API 使您能够将时间用于构建应用程序的逻辑,而不是担心数据传输。

  • 异步和同步优先:通道原生支持同步和异步操作,无需使用启动线程或运行单独运行时的任何复杂方法。

实际应用

[dependencies.channels]
version = "0.12"
features = ["full"]
use tokio::net::TcpStream;

use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
enum Message {
    Ping,
    Pong
}

#[tokio::main]
async fn main() {
    let stream = TcpStream::connect("127.0.0.1:8080").await.unwrap();
    let (r, w) = stream.into_split();
    let (mut tx, mut rx) = channels::channel::<Message, _, _>(r, w);

    loop {
        match rx.recv().await.unwrap() {
            Message::Ping => {
                println!("pinged!");
                tx.send(Message::Pong).await.unwrap();
            }
            Message::Pong => {
                println!("ponged!");
            }
        }
    }
}

更多内容请参阅: examples/

工作原理

通道实现了一种通信协议,允许通过任何介质发送和接收数据。它可以在 任何 同步或异步流上工作。目前它可以与以下 IO 特性一起使用

有关底层通信协议如何工作的更多信息,请参阅 此处

许可证

依赖项

~0–11MB
~143K SLoC