6个版本
0.3.0 | 2020年5月1日 |
---|---|
0.2.1 | 2020年4月28日 |
0.1.2 | 2020年4月19日 |
在WebSocket类别中排名第180
每月下载量37次
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