20 个版本

0.6.0 2024 年 4 月 16 日
0.5.0 2024 年 3 月 31 日
0.4.4 2023 年 11 月 18 日
0.4.3 2023 年 7 月 8 日
0.2.0 2021 年 3 月 13 日

#9WebSocket 中排名

Download history 2497/week @ 2024-04-25 2356/week @ 2024-05-02 2413/week @ 2024-05-09 2215/week @ 2024-05-16 2481/week @ 2024-05-23 2857/week @ 2024-05-30 3250/week @ 2024-06-06 3044/week @ 2024-06-13 2395/week @ 2024-06-20 2738/week @ 2024-06-27 2618/week @ 2024-07-04 3061/week @ 2024-07-11 3021/week @ 2024-07-18 3149/week @ 2024-07-25 2995/week @ 2024-08-01 2469/week @ 2024-08-08

12,274 每月下载量
用于 10 个 Crates8 个直接使用)

MIT 许可协议

320KB
7K SLoC

Latest Version docs.rs Build and code style Test codecov

Rust-socketio-client

Rust 编程语言编写的 socket.io 客户端实现。此实现目前支持 socket.io 协议的第 5 版本,因此支持 engine.io 协议的第 4 版本。如果您与此客户端有任何连接问题,请确保服务器使用至少 engine.io 协议的第 4 版本。有关 async 版本的信息见下文。

示例用法

将以下内容添加到您的 Cargo.toml 文件中

rust_socketio = "*"

然后您可以使用以下示例代码

use rust_socketio::{ClientBuilder, Payload, RawClient};
use serde_json::json;
use std::time::Duration;

// define a callback which is called when a payload is received
// this callback gets the payload as well as an instance of the
// socket to communicate with the server
let callback = |payload: Payload, socket: RawClient| {
       match payload {
           Payload::String(str) => println!("Received: {}", str),
           Payload::Binary(bin_data) => println!("Received bytes: {:#?}", bin_data),
       }
       socket.emit("test", json!({"got ack": true})).expect("Server unreachable")
};

// get a socket that is connected to the admin namespace
let socket = ClientBuilder::new("https://127.0.0.1:4200")
     .namespace("/admin")
     .on("test", callback)
     .on("error", |err, _| eprintln!("Error: {:#?}", err))
     .connect()
     .expect("Connection failed");

// emit to the "foo" event
let json_payload = json!({"token": 123});
socket.emit("foo", json_payload).expect("Server unreachable");

// define a callback, that's executed when the ack got acked
let ack_callback = |message: Payload, _| {
    println!("Yehaa! My ack got acked?");
    println!("Ack data: {:#?}", message);
};

let json_payload = json!({"myAckData": 123});
// emit with an ack
socket
    .emit_with_ack("test", json_payload, Duration::from_secs(2), ack_callback)
    .expect("Server unreachable");

socket.disconnect().expect("Disconnect failed")

此crate使用的主要入口点是 ClientBuilder,它提供了一种轻松配置所需方式的socket的方法。当在builder上调用 connect 方法时,它返回一个已连接的客户端,然后可以使用它向特定事件发送消息。一个客户端只能连接到一个命名空间。如果您需要监听不同命名空间中的消息,则需要分配多个socket。

文档

有关此crate的文档可以在 docs.rs 上找到。

当前功能

此实现现在支持此处提到的 socket.io 协议的所有功能 here。它通常尽可能使用 WebSocket。这意味着大多数时候只有打开请求使用 HTTP,一旦服务器表示它能够升级到 WebSocket,就会执行升级。但如果此升级不成功或服务器没有提到升级的可能性,则使用 HTTP 长轮询(如协议规范中指定)。以下是可能的用例概述

  • 连接到服务器。
  • 注册以下事件类型的回调函数
    • 打开
    • 关闭
    • 错误
    • 消息
    • 自定义事件,如 "foo","on_payment" 等。
  • 将JSON数据发送到服务器(通过提供安全处理的serde_json)。
  • 将JSON数据发送到服务器并接收一个ack
  • 发送和处理二进制数据。

异步版本

此库提供使用tokio作为执行运行时的能力来在异步上下文中执行。请注意,当前的异步实现仍然是实验性的,接口可能会随时发生变化。异步的ClientClientBuilder支持与同步版本类似的接口,位于asynchronous模块中。为了启用支持,您需要启用async功能标志

rust_socketio = { version = "*", features = ["async"] }

以下代码以异步方式展示了上面的示例

use futures_util::FutureExt;
use rust_socketio::{
    asynchronous::{Client, ClientBuilder},
    Payload,
};
use serde_json::json;
use std::time::Duration;

#[tokio::main]
async fn main() {
    // define a callback which is called when a payload is received
    // this callback gets the payload as well as an instance of the
    // socket to communicate with the server
    let callback = |payload: Payload, socket: Client| {
        async move {
            match payload {
                Payload::String(str) => println!("Received: {}", str),
                Payload::Binary(bin_data) => println!("Received bytes: {:#?}", bin_data),
            }
            socket
                .emit("test", json!({"got ack": true}))
                .await
                .expect("Server unreachable");
        }
        .boxed()
    };

    // get a socket that is connected to the admin namespace
    let socket = ClientBuilder::new("https://127.0.0.1:4200/")
        .namespace("/admin")
        .on("test", callback)
        .on("error", |err, _| {
            async move { eprintln!("Error: {:#?}", err) }.boxed()
        })
        .connect()
        .await
        .expect("Connection failed");

    // emit to the "foo" event
    let json_payload = json!({"token": 123});
    socket
        .emit("foo", json_payload)
        .await
        .expect("Server unreachable");

    // define a callback, that's executed when the ack got acked
    let ack_callback = |message: Payload, _: Client| {
        async move {
            println!("Yehaa! My ack got acked?");
            println!("Ack data: {:#?}", message);
        }
        .boxed()
    };

    let json_payload = json!({"myAckData": 123});
    // emit with an ack
    socket
        .emit_with_ack("test", json_payload, Duration::from_secs(2), ack_callback)
        .await
        .expect("Server unreachable");

    socket.disconnect().await.expect("Disconnect failed");
}

仓库内容

此仓库包含socket.io协议的Rust实现以及底层的engine.io协议。

有关engine.io协议的详细信息,请在此处查看

此处是socket.io协议的规范

查看组件图,以下部分已实现(来源:https://socketio.node.org.cn/images/dependencies.jpg

许可

MIT

依赖

~7–19MB
~298K SLoC