< 返回版块

PrivateRookie 发表于 2021-11-30 19:15

Tags:websocket, proxy, tokio

大家好, ws-tool 项目 0.3.0 版本发布了, ws-tool 是一个基于 tokio 的 rust websocket 库, 你可以用它来创建客户端或服务端. 相比于 0.2 版本, 0.3 对接口进行了重构, 使其更方便使用. 目前提供功能有

  • http/socks5 代理支持
  • client/server 支持
  • 支持获取的消息类型包括最底层的websocket frame(数据包), BytesMut(二进制数据)和 String(最常用类型)
  • 支持类似与 tcpstream 一样的 split 方法, 将 websocket 连接切成 readable 和 writeable, 充分利用 websocket 全双工的特性
  • 支持自定义client/server协议握手处理方法, 你可以在这些方法里处理握手请求header, 返回特定消息Codec
  • 支持自定义 Encoder/Decoder, 方便将数据直接转化成期望的数据类型
  • 标准 autobahn test suit client 测试用例通过率 90%+

example

客户端例子, 来自 echo 省略准备的代码, 创建一个 websocket 代码如下

let mut builder = ClientBuilder::new(&args.uri);
if let Some(cert) = args.cert {
    builder = builder.cert(cert);
}
if let Some(proxy) = args.proxy {
    builder = builder.proxy(&proxy)
}
let mut client = builder
    .connect_with_check(default_string_check_fn)
    .await
    .unwrap();

while let Some(Ok((_, msg))) = client.next().await {
    // read write message here
}

服务端例子, 来自server 同样省略了一些准备代码

    for (stream, addr) in listener.accept().await {
        tracing::info!("got connect from {:?}", addr);
        let mut server = ServerBuilder::accept(
            stream,
            default_handshake_handler,
            default_string_codec_factory,
        )
        .await
        .unwrap();
        while let Some(Ok((code, msg))) = server.next().await {
            if code == OpCode::Close {
                break;
            }
            server.send(msg).await.unwrap();
        }

使用代理的例子可以参考 binance

split 客户端的例子可以参考 split_binance

欢迎提issue或PR


Ext Link: https://privaterookie.github.io/ws-tool/

评论区

写评论
biluohc 2021-11-30 20:20

rust的异步ws库都不支持 permessage-deflate,你这个要是能支持就好了

1 共 1 条评论, 1 页