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 日 |
#9 在 WebSocket 中排名
12,274 每月下载量
用于 10 个 Crates(8 个直接使用)
320KB
7K SLoC
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
作为执行运行时的能力来在异步上下文中执行。请注意,当前的异步实现仍然是实验性的,接口可能会随时发生变化。异步的Client
和ClientBuilder
支持与同步版本类似的接口,位于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