1个稳定版本
新版本 2.0.0 | 2024年8月21日 |
---|
#5 in #cbsk
137 每月下载量
125KB
2K SLoC
cbsk是一个TCP数据回调工具,允许您专注于业务处理,无需担心TCP数据的读取、写入和拆分
支持Rust的最小版本
1.80.0
内部协议
cbsk内部有一个自定义的TCP数据验证协议,其协议逻辑如下
-
验证数据是否使用['c ',' b ','s',' k ']作为头部帧。如果不是,则丢弃数据。当然,您也可以自定义数据帧头部
-
获取头部帧之后的第一个字节,该字节代表数据长度的描述
-
根据数据长度的描述获取真实数据长度
-
读取真实数据,如果有数据包占用,则拆分并调用回调。如果长度不足,则等待下一个TCP数据到达,直到长度一致
-
重复上述步骤,并重新开始第一个步骤
cbsk客户端示例
Cargo.toml
cbsk_base = "2.0.0"
cbsk_tokio = { version = "2.0.0", default-features = false, features = ["client"] }
fast_log = "1.7.3"
main.rs
use std::net::{IpAddr, SocketAddr};
use std::sync::LazyLock;
use cbsk_base::{log, tokio};
use cbsk_base::log::LevelFilter;
use cbsk_tokio::business::cbsk_write_trait::CbskWriteTrait;
use cbsk_tokio::client::callback::CbskClientCallBack;
use cbsk_tokio::client::CbskClient;
#[allow(non_upper_case_globals)]
static addr: LazyLock<SocketAddr> = LazyLock::new(|| { SocketAddr::new(IpAddr::from([127, 0, 0, 1]), 8080) });
#[allow(non_upper_case_globals)]
static cbsk_client: LazyLock<CbskClient> = LazyLock::new(|| {
CbskClient::new(Cb {}.into(), *addr, 1024)
});
#[tokio::main]
pub async fn main() {
fast_log::init(fast_log::config::Config::default().level(LevelFilter::Info).console()).unwrap();
cbsk_client.start().await;
}
struct Cb {}
impl CbskClientCallBack for Cb {
async fn conn(&self) {
cbsk_client.send_bytes(b"hello server".to_vec()).await;
}
async fn recv(&self, bytes: Vec<u8>) {
log::info!("bytes is {bytes:?}");
cbsk_client.send_bytes(b"hello server".to_vec()).await;
}
}
cbsk服务器示例
Cargo.toml
cbsk_base = "2.0.0"
cbsk_tokio = "2.0.0"
fast_log = "1.7.3"
main.rs
use std::net::{IpAddr, SocketAddr};
use std::sync::Arc;
use cbsk_base::log::LevelFilter;
use cbsk_base::{log, tokio};
use cbsk_tokio::business::cbsk_write_trait::CbskWriteTrait;
use cbsk_tokio::server::callback::CbskServerCallBack;
use cbsk_tokio::server::CbskServer;
use cbsk_tokio::server::client::CbskServerClient;
#[tokio::main]
pub async fn main() {
fast_log::init(fast_log::config::Config::default().level(LevelFilter::Info).console()).unwrap();
let addr = SocketAddr::new(IpAddr::from([127, 0, 0, 1]), 8080);
let cbsk_server = CbskServer::new(Cb {}.into(), addr, 1024);
cbsk_server.start().await;
}
struct Cb {}
impl CbskServerCallBack for Cb {
async fn recv(&self, bytes: Vec<u8>, client: Arc<CbskServerClient>) {
log::info!("recv is {bytes:?}");
client.send_bytes(b"hello client".to_vec()).await;
}
}
依赖关系
~4–13MB
~131K SLoC