#tcp #sockets #net #cbsk #data #callback #server-client

cbsk_tokio

tokio的回调套接字工具

1个稳定版本

新版本 2.0.0 2024年8月21日

#5 in #cbsk

Download history 137/week @ 2024-08-17

137 每月下载量

MIT/Apache

125KB
2K SLoC

cbsk是一个TCP数据回调工具,允许您专注于业务处理,无需担心TCP数据的读取、写入和拆分

支持Rust的最小版本

1.80.0

内部协议

cbsk内部有一个自定义的TCP数据验证协议,其协议逻辑如下

  1. 验证数据是否使用['c ',' b ','s',' k ']作为头部帧。如果不是,则丢弃数据。当然,您也可以自定义数据帧头部

  2. 获取头部帧之后的第一个字节,该字节代表数据长度的描述

  3. 根据数据长度的描述获取真实数据长度

  4. 读取真实数据,如果有数据包占用,则拆分并调用回调。如果长度不足,则等待下一个TCP数据到达,直到长度一致

  5. 重复上述步骤,并重新开始第一个步骤

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