首页
学习
活动
专区
工具
TVP
发布

【投稿】actix-websocket 使用 protocol的一点个人理解

actix的docs和example对的使用有点省略,对着源码实验了下,终于搞清楚了。

标准浏览器websocket的构造函数会有个可选参数,即一个字符串形式的约定协议。

对于actix的websocket的例子一般如下,即用来初始化websocket。

structMyWebSocket{}

asyncfnws_index(r: HttpRequest, stream: web::Payload) ->Result {

ws::start(MyWebSocket::new(), &r, stream)

}

如果前端传了,actix会响应请求然后自动关闭连接,并不能正常构建websocket连接。

这里整了我半天,后来才发现有一个初始函数叫,必须用这个函数才能接收带有的websocket连接。

pubfnstart_with_protocols(

actor: A,

protocols: &[&str],

req: &HttpRequest,

stream: T,

) ->Result

where

A: Actor

+ StreamHandler,

T: Stream +'static,

{

letmutres = handshake_with_protocols(req, protocols)?;

Ok(res.streaming(WebsocketContext::create(actor, stream)))

}

比普通的多了个参数,试试了这个其实代表的是合法的协议名列表,即前端传来的必须在里面才能正常构建websocket连接。

然后顺便看了方法的源码,发现其实也调用了这个方法,但会默认令合法协议,也就是置空, 这样如果前端如果没传,actix处理出的则为,可以满足构建要求, 如果不为空,则必然不在合法协议列表里面,所以无法正常构建websocket连接。

不过令人困惑的是,在初始化以后,如果想在websocket的帧里获取是什么,并不能像在处理路由句柄时里的里面直接获取,所以我的解决办法是在自定义的结构体里进行保存。

structMyWebSocket{

protocol:String

}

implMyWebSocket {

fnnew(protocol:String) ->Self{

Self

}

}

constPROTOCOLS: &[&str] = &["chat"];

asyncfnws_index(r: HttpRequest, stream: web::Payload) ->Result {

letprotocol = r.headers().get(&header::SEC_WEBSOCKET_PROTOCOL).unwrap().to_str().unwrap();

ws::start_with_protocols(MyWebSocket::new(protocol.to_string()), PROTOCOLS, &r, stream)

}

这样就可以在接收流处理句柄里拿到了,根据websocket的帧协议来看,似乎确实不包含的信息,所以大概也只能从请求头那里拿到信息了。本来想在里找信息的,不过看了看源码似乎并没有找到存取的api,实在整不明白,只能自己存了,不知道还有没有更正统的办法。

implStreamHandlerforMyWebSocket {

fnhandle(

&mutself,

msg:Result,

ctx: &mutSelf::Context,

) {

println!("WS({}): {:?}",self.protocol, msg);

matchmsg {

Ok(ws::Message::Ping(msg)) => ctx.pong(&msg),

Ok(ws::Message::Pong(_)) => (),

Ok(ws::Message::Text(text)) => ctx.text(text),

Ok(ws::Message::Binary(bin)) => ctx.binary(bin),

Ok(ws::Message::Close(reason)) => {

ctx.close(reason);

ctx.stop();

}

_ => ctx.stop(),

}

}

}

总结一下,关于actix的websocket连接里获取方法就是用来初始化连接,通过来获取,如果想在流处理获取的信息,则需要在处理路由句柄时通过自定义结构体里提前存储的信息。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201231A0HRFC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券