15 个版本 (6 个重大更新)
使用旧的 Rust 2015
0.7.1 | 2017 年 3 月 21 日 |
---|---|
0.7.0 | 2017 年 3 月 19 日 |
0.6.0 | 2017 年 3 月 16 日 |
0.5.3 | 2017 年 3 月 13 日 |
0.1.4 | 2017 年 2 月 23 日 |
#177 在 WebSocket
在 5 crate 中使用
140KB
3K SLoC
twist
作为 tokio-core Codec 和 tokio-proto pipeline ServerProto 的 RFC6455 WebSocket 协议实现
这可以用来在一个 tokio-proto TcpServer 中提供 tokio-service Service (见 twists 中的示例)。
注意:尽管这是一个作为管道协议实现的,但支持分片 WebSocket 消息,因此支持从 WebSocket 客户端进行流式传输。
用法
在您的 Cargo.toml
依赖项部分包含以下内容
twist = "0.1.3"
扩展
twist
现在支持按消息扩展。当文本或二进制帧完成时,或者一组分片文本或二进制帧完全组装时,应用一个按消息扩展。
实现
twist
提供了三个与实现扩展相关的特质
-
FromHeader
- 根据请求头Sec-WebSocket-Extensions
的内容进行扩展配置。实现init
函数以根据此头部配置您的扩展。如果您无法支持给定的头部参数,应返回一个io::Error
。如果参数与您的扩展不相关,您应确保您的enabled
函数返回 false。fn init(&mut self, request: &str) -> Result<(), io::Error> { if request.contains("permessage-deflate") { self.enabled = true; let pmds: Vec<&str> = request.split(',').take_while(|s| s.starts_with("permessage-deflate")).collect(); for pmd in pmds { // Check the config here. // return io::Error if it is invalid. } } Ok(()) }
-
IntoResponse
- 实现返回Sec-WebSocket-Extensions
响应头的response
函数。如果您被禁用,则返回None
。 -
PerMessage
- 这是扩展的核心。有三个方法要实现。a.
reserve_rsv
- 如果您的扩展需要使用帧的rsv位之一,您可以尝试预留它。您收到的值代表在扩展链中之前已经预留的位。检查您的位(或位)是否空闲,并将您的位与给定位进行按位或操作,然后返回该值。以下是从twist-deflate
中的示例。deflate扩展需要rsv1位,因此RSV1为4(0b100)。if current_rsv & RSV1 == 0 { Ok(current_rsv | RSV1) } else { Err(other("rsv1 bit already reserved")) }
b.
decode
- 实现此功能以对消息帧进行解码(例如解压缩应用程序数据)。c.
encode
- 实现此功能以在twist最终编码之前对消息帧进行编码(例如压缩应用程序数据)。
有关更完整的示例,请参阅 twist-deflate。
文档
示例用法
请参阅 twists 项目,了解使用twist实现的echo服务器的示例实现。
依赖项
~13MB
~228K SLoC