#tcp-socket #tcp #sockets #net #callback #data #tool

cbsk

cbsk 是一个回调套接字工具

27 个版本 (16 个稳定版)

新版本 2.0.0 2024 年 8 月 21 日
1.3.12 2024 年 8 月 19 日
1.3.11 2024 年 7 月 26 日
0.4.3 2024 年 4 月 11 日
0.2.0 2024 年 3 月 29 日

#938 in 网络编程

Download history 64/week @ 2024-05-01 238/week @ 2024-05-08 277/week @ 2024-05-15 183/week @ 2024-05-22 2/week @ 2024-05-29 166/week @ 2024-06-05 4/week @ 2024-06-12 138/week @ 2024-06-26 7/week @ 2024-07-03 4/week @ 2024-07-10 112/week @ 2024-07-17 273/week @ 2024-07-24 55/week @ 2024-07-31 127/week @ 2024-08-14

每月 457 次下载
用于 2 crates

MIT/Apache 许可

12KB
133

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;
    }
}

无运行时依赖