1个不稳定版本
0.1.0 | 2023年9月13日 |
---|
#6 in #tokio-codec
每月181次下载
56KB
1K SLoC
Cobs-Codec
此crate提供用于Tokio的COBS(一致开销字节填充)编解码器。
COBS编码是一种非常高效的网络数据包封装方法。基本上;它允许你发送由任何字节组成的消息,同时仍然能够检测到消息的开始和结束。
编码的消息以一个特定的(可自定义的)字节结尾,称为哨兵。通过替换方案避免消息中此字节的出现,该方案添加的额外开销非常小:O(1 + N/254)
最坏情况。
选择哨兵值
此crate允许用户选择自己的哨兵值。选择值时有两个指导原则。
大小:当消息中每254个字节至少有一个哨兵时,编码的开销最小。请注意,对于长度不超过254个字节的短消息,此考虑因素不相关。
速度:编码/解码速度最快的是包含尽可能少的哨兵值的消息,理想情况下没有。
功能
- 无不安全代码 (
#[forbid)
) - 已测试
示例
use std::io::Cursor;
use tokio_util::codec::{FramedWrite, FramedRead};
use futures::{SinkExt, StreamExt};
use cobs_codec::{Encoder, Decoder};
// Choose a message separator that does not appear too frequently in your messages.
const SENTINEL: u8 = 0x00;
// It's a good idea to limit message size to prevent running out of memory.
const MAX: usize = 32;
let encoder = Encoder::<SENTINEL, MAX>::new();
let decoder = Decoder::<SENTINEL, MAX>::new();
// Imagine this buffer being sent from the server to the client.
let mut buffer = Vec::with_capacity(128);
let mut server_cursor = Cursor::new(&mut buffer);
let mut server = FramedWrite::new(&mut server_cursor, encoder);
// Send a few messages.
assert!(server.send("hello").await.is_ok());
assert!(server.send("world").await.is_ok());
let mut client_cursor = Cursor::new(&mut buffer);
let mut client = FramedRead::new(&mut client_cursor, decoder);
// Receive the messages.
assert_eq!(convert(&client.next().await), Some(Ok(b"hello".as_slice())));
assert_eq!(convert(&client.next().await), Some(Ok(b"world".as_slice())));
assert_eq!(convert(&client.next().await), None);
文档
许可协议
许可协议为以下之一
- Apache许可证版本2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确表示,否则您根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,都将根据上述方式双重许可,无需附加条款或条件。
依赖项
~2.7–4.5MB
~72K SLoC