报错内容
io.netty.handler.codec.htttp.websocketx.textwebsocketframe can not be cast to io.netty.handler.codec.http.FullHttpRequest;
核心问题
springboot项目设定了项目访问前缀,/project/
而我只给websocket设定了单独的访问路径
pipeline.addLast(new WebSocketServerProtocolHandler(“/msg”));
前台初始化websocket的路径是
this.socket=new WebSocket(“ws://localhost:9999/project/msg”);
websocket里面的访问路径应该将项目统一的访问前缀加进去。
pipeline.addLast(new WebSocketServerProtocolHandler(“/project//msg”));
报错流程:
首先,netty服务器是能正常启动起来的,然后,第一次Http请求升级为websocket是成功的,然后在后面触发 send方法的时候,出现了上面的报错。
其实在最开始搭建服务器的时候,报错内容不是这个,具体是什么已经记不清了,这个问题困扰了我半个月,逐步前进,才到了上面的报错。
textwebsocketframe 是用于websocket握手成功后,用于传递消息的消息体,FullHttpRequest是在初次握手时第一次为了将http请求升级为websocket时用的消息体。问题的表现是,握手已经成功了,且用textwebsocketframe 传递消息,但是解析消息却走了 为握手的http方法FullHttpRequest
报错类名称
websocketserverprotocolHandshakehandler
里面的channelread方法,看源码可以了解,在开始即刻进行了强制类型转换
FullHttpRequest req=(FullHttpRequest)msg;
在这报的错。
这里的channelread无论在通信升级为websocket前还是后,都是会触发的,根据请求判断是否是websocket类型的请求。如果是websocket类型,会将解析http数据的解析器失效。然后将解析websocket的解析器加进来。文章来源:https://www.toymoban.com/news/detail-619064.html
初始化的时候,我自己重写了判断是否是websocket的方法,然后直接握手成功了,但是在流程中,判断结果还是非websocket数据。
判断方法是根据访问的uri来进行判断,如此,项目前缀我没有加入到设定的uri中,结果是
判断请求类型为非websocket类型了,导致执行了按非websocket的流程。文章来源地址https://www.toymoban.com/news/detail-619064.html
到了这里,关于记录一次springboot+netty+websocket报错的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!