#websocket-client #client-server #standard #io #web

已删除 simple-websocket

一个简单的WebSocket实现,用于客户端和服务器

2 个不稳定版本

0.3.0 2024年8月4日
0.2.0 2024年8月2日
0.1.0 2024年8月2日

#14 in #websocket-client

Download history 109/week @ 2024-07-27 196/week @ 2024-08-03 5/week @ 2024-08-10

310 次每月下载

Apache-2.0

36KB
570

simple-websocket

适用于Tokio堆栈的简单异步WebSocket实现。

Apache licensed

简介

这个库旨在提供一个简单的WebSocket实现,以便最终用户可以使用它将WebSocket服务器/客户端包装到他们的应用程序中,提供一个平滑的设置方法。

它是一个基于tokio运行时的异步库,使用tokio TcpStream作为参数,使用这个字节流来实现WebSocket协议RFC的标准,执行握手、读取帧、解析掩码和内部有效负载。

库内部和最终用户的大部分通信都使用tokio mpsc传递二进制数据、帧和错误。在将TcpStream发送到我们的函数后,您将收到WSConnection结构体,它有一个用于读取数据的mpsc通道,以及一些用于发送二进制、文本、ping和关闭帧的公共方法。

背后的动机是提供一个简单的方法,在您的应用程序中拥有WebSocket连接,以广泛建立的库,如tungstenite-rstokio-tungstenite为参考。

特性

实现了大多数WebSocket RFC特性,例如

  • 握手过程,密钥解析和生成
  • 操作码处理,如TextBinaryPingPongContinue
  • 多个订阅
  • 可扩展性
  • 错误处理

即将添加的特性

  • 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