6个版本

0.3.0 2020年5月1日
0.2.1 2020年4月28日
0.1.2 2020年4月19日

WebSocket类别中排名第180

每月下载量37

MIT协议

85KB
2K SLoC

yarws

yarws是基于Tokio运行时的WebSocket协议实现。用于构建WebSocket服务器或客户端。

yarws = 另一个Rust WebSocket库

从版本0.2.0开始,在连接(connect)中支持TLS(wss://端点)。

Lib通过了所有autobahn测试。包括压缩消息的测试。对传入消息实现了按消息的deflate压缩。Lib可以接收压缩消息。目前所有传出消息都未进行压缩。

示例

服务器

    let addr = "127.0.0.1:9001";
    let mut listener = Server::new(addr).bind().await?;
    while let Some(mut socket) = listener.accept().await {
        tokio::spawn(async move {
            while let Some(msg) = socket.recv().await {
                socket.send(msg).await.unwrap();
            }
        });
    };

这是一个回显服务器的示例。我们对每个传入的消息回复相同的消息。第二行开始监听ip:port上的WebSocket连接。每个客户端由从Socket返回的accept返回的Socket表示。对于每个客户端,我们循环等待消息到达,并回复相同的消息。完整的回显服务器示例请参阅examples/echo_server.rs

客户端

    let url = "ws://127.0.0.1:9001";
    let mut socket = Client::new(url).connect().await?;
    while let Some(msg) = socket.recv().await {
        socket.send(msg).await?;
    }

这是一个回显客户端的示例。`connect`方法返回一个Socket,用于发送和接收消息。在recv循环中,返回每个传入的消息,直到套接字关闭。在这里的循环中,我们回复相同的消息。完整的客户端示例请参阅examples/client.rs

测试

运行带外部回显服务器的客户端。

cargo run --example client -- ws://echo.websocket.org

客户端将发送一些不同大小的消息,并期望收到相同的回复。如果一切顺利,将无错误地完成。

在服务器上运行相同的客户端。首先启动服务器

cargo run --example echo_server

然后在另一个终端运行客户端

cargo run --example client

如果处于跟踪日志模式,服务器将记录接收到的每个消息的类型和大小。

websocat测试工具

您可以使用websocat连接到服务器并测试通信。首先启动服务器

cargo run --example echo_server

然后在另一个终端运行websocat

websocat -E --linemode-strip-newlines ws://127.0.0.1:9001

输入您的消息,按Enter键发送,服务器将回复相同的消息。要更令人兴奋,请在反向标志下运行服务器

cargo run --bin echo_server -- --reverse

然后使用websocat发送文本消息。

Autobahn测试

确保您已安装wstest autobahn-testsuite测试工具

pip install autobahntestsuite

启动echo_server

cargo run --bin echo_server

在另一个终端运行服务器测试并查看结果

cd autobahn
wstest -m fuzzingclient
open reports/server/index.html

为了测试客户端实现,首先启动autobahn服务器套件

wstest -m fuzzingserver

然后在另一个终端运行客户端测试并查看结果

cargo run --bin autobahn_client
open autobahn/reports/client/index.html

出于开发目的,存在用于运行autobahn测试套件并显示结果的自动化脚本

cargo run --bin autobahn_server_test

您可以在开发过程中使用cargo-watch在每个文件更改时运行它

cargo watch -x 'run --bin autobahn_server_test'

聊天服务器示例

服务器接受文本消息并将它们分发到所有已连接客户端的简单示例。首先启动聊天服务器

cargo run --bin chat_server

然后在浏览器开发控制台中连接到服务器并发送聊天消息

var socket = new WebSocket('ws://127.0.0.1:9001');
var msgNo = 0;
var interval;
socket.addEventListener('open', function (event) {
    console.log('open');
    socket.send("new client");
    interval = setInterval(function() {
        msgNo++;
        socket.send("message: " + msgNo);
    }, 1000);
});
socket.addEventListener('message', function (event) {
    console.log('chat', event.data);
});
socket.addEventListener('close', function (event) {
    console.log('closed');
    clearInterval(interval);
});

使用相同的代码启动多个浏览器标签。您可以使用以下方式从服务器断开连接:socket.close();

参考资料

WebSocket协议 IETF RFC 6455 MDN编写WebSocket服务器

许可证:MIT

依赖项

~10–21MB
~311K SLoC