最近在做一个java web项目,里面需要集成netty websocket。java web项目作为服务器端已经完全可以和客户端进行数据通信。但是存在一个问题,当客户端向服务器端发送一个超长json串时候,提示Max frame length of 65536 has been exceeded。于是我在WebSocketServerHandler 初始化握手对象时,指定了maxFramePayloadLength 的长度:
WebSocketServerHandshakerFactory wsFactory= new WebSocketServerHandshakerFactory(getWebSocketLocation(req), null, true,6553600);。
但此时客户端再想服务端发送这个较长的json数据时候,提示net.sf.json.JSONException: Unterminated string at character 131072 of。json解析异常,我发现这个超长的json在被netty接收的时候切断了,到达一定长度之后的部分都没获取到,最后的括号等自然没有了。
找了相关资料发现通过配置netty内置jie ma qi可以处理数据半包等问题,于是initChannel时增加了:addLast("frameDecoder", new LengthFieldBasedFrameDecoder(65536,0,2));
然而此时出现的问题已经无从解决了。增加上行代码后因为客户端已经无法与服务端建立websocket通信了,没有任何报错信息。点击发送信息,就是提示websocket未建立!
配置addLast("frameDecoder", new LengthFieldBasedFrameDecoder(65536,0,2));这个netty内置的jie ma qi竟然还会影响整个websocket通讯吗?请大神不吝赐教!(jie ma qi是屏蔽词)
<p>1. LengthFieldBasedFrameDecoder这个是指你的每个报文的长度是固定的,你websocket明显与这个不符啊。</p>
2. 另外针对题主说的json解析失败的问题,需要搞清楚是在客户端被截断的还是服务端接收的时候被截断的
回复 <a class="referer" target="_blank">@梵高Sakalaka</a> : 遇到同样的问题,是什么原因呢
是在在服务器端被截断的。
<p>楼主解决了吗, 我这也遇到这个问题了....</p>
回复 <a class="referer" target="_blank">@facio</a> : 已经解决了。有需要可以私信发我企鹅号,demo可以发你
我也一样,不知道楼主对这个问题是否有解答
<pre>addLast(new WebSocketServerProtocolHandler("yourpath", null, true));</pre>
true是关键
当初试过了,和这个好像没关系。
<p>你好,我这边也遇到了同样的问题,请问是如何解决的 ?能分享一下解决方案吗?十分感谢🙏</p>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。