5 个版本
0.1.4 | 2020 年 6 月 17 日 |
---|---|
0.1.3 | 2020 年 6 月 17 日 |
0.1.2 | 2020 年 6 月 17 日 |
0.1.1 | 2020 年 6 月 17 日 |
0.1.0 | 2020 年 6 月 8 日 |
#257 in WebSocket
22KB
343 行
为 HAWK 设计
示例
use tokio::net::TcpListener;
use http_rs::Http;
use websocket_rs::{ Websocket, Opcode };
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut listener = TcpListener::bind("127.0.0.1:8080").await?;
println!("Listening for websocket connections on 127.0.0.1:8080");
while let Ok((stream, addr)) = listener.accept().await {
tokio::spawn(async move {
println!("New connection from {:?}", addr);
let mut http = Http::new(stream);
if let Some(req) = http.next().await {
if req.for_websocket() {
let mut ws = Websocket::new_with_key(
http.transport.into_inner(),
req.headers.get("sec-websocket-key").unwrap().to_string()
);
while let Some(msg) = ws.next().await {
println!("{:?}", msg);
if msg.opcode == Opcode::Text {
let response = format!("Received: {:?}", msg.payload);
ws.send_text(response).await.unwrap();
}
}
println!("Client from {:?} disconnected", addr);
}
}
});
}
Ok(())
}
待办事项
- 正确处理错误
- 接收 TEXT 操作码
- 收到 Ping 时回复 Pong
- 处理所有有效负载长度 (le 125, =126, =127)
- 掩码密钥
- 关闭 WebSocket 连接
- 读取分片帧
- 将 WebSocket 提取到其自己的 crate 中
- 添加二进制支持
- 当大小达到阈值时发送分片帧
- 安排 ping/pong
- 将 ping 中的应用程序数据包含在 pong 中
- 跟踪连接的客户端
依赖项
~7–14MB
~129K SLoC