2 个不稳定版本
0.3.0 | 2024年8月4日 |
---|---|
0.2.0 | 2024年8月2日 |
0.1.0 |
|
#14 in #websocket-client
310 次每月下载
36KB
570 行
simple-websocket
适用于Tokio堆栈的简单异步WebSocket实现。
简介
这个库旨在提供一个简单的WebSocket实现,以便最终用户可以使用它将WebSocket服务器/客户端包装到他们的应用程序中,提供一个平滑的设置方法。
它是一个基于tokio运行时的异步库,使用tokio TcpStream作为参数,使用这个字节流来实现WebSocket协议RFC的标准,执行握手、读取帧、解析掩码和内部有效负载。
库内部和最终用户的大部分通信都使用tokio mpsc传递二进制数据、帧和错误。在将TcpStream发送到我们的函数后,您将收到WSConnection
结构体,它有一个用于读取数据的mpsc通道,以及一些用于发送二进制、文本、ping和关闭帧的公共方法。
背后的动机是提供一个简单的方法,在您的应用程序中拥有WebSocket连接,以广泛建立的库,如tungstenite-rs
和tokio-tungstenite
为参考。
特性
实现了大多数WebSocket RFC特性,例如
- 握手过程,密钥解析和生成
- 操作码处理,如
Text
、Binary
、Ping
、Pong
和Continue
- 多个订阅
- 可扩展性
- 错误处理
即将添加的特性
- Autobahn测试
- TLS/SSL支持
用法
在您的Cargo.toml
中添加以下内容
[dependencies]
simple-websocket = "*"
用法示例
以下是一个ping-pong服务器示例,您也可以在示例中找到
use log::*;
use simple_websocket::handshake::perform_handshake;
use std::net::SocketAddr;
use tokio::net::{TcpListener, TcpStream};
use tokio::select;
async fn handle_connection(_: SocketAddr, stream: TcpStream) {
match perform_handshake(stream).await {
Ok(mut ws_connection) => loop {
select! {
Some(result) = ws_connection.read.recv() => {
match result {
Ok(message) => {
if ws_connection.send_data(message).await.is_err() {
eprintln!("Failed to send message");
break;
}
}
Err(err) => {
eprintln!("Received error from the stream: {}", err);
break;
}
}
}
else => break
}
},
Err(err) => eprintln!("Error when performing handshake: {}", err),
}
}
#[tokio::main]
async fn main() {
env_logger::init();
let addr = "127.0.0.1:9002";
let listener = TcpListener::bind(&addr).await.expect("Can't listen");
info!("Listening on: {}", addr);
while let Ok((stream, _)) = listener.accept().await {
let peer = stream
.peer_addr()
.expect("connected streams should have a peer address");
info!("Peer address: {}", peer);
tokio::spawn(handle_connection(peer, stream));
}
}
要运行此示例,您可以克隆存储库并执行
cargo run --color=always --package simple-websocket --example internal_server
此示例创建一个TcpListener,将其绑定到端口,接受连接,在每个连接内部处理tokio任务,以并发处理客户端。handle_connection函数确保执行握手过程,返回一个WSConnection
,该连接具有tokio mpsc通道,您可以在其中消费此客户端的传入数据,并执行socket操作写入,包括通过Result
的错误处理。
您可以在示例中查看更多。
参考资料
依赖项
~5–12MB
~123K SLoC