通常引起异常的原因是因为netty的计数的机制,
在服务器收到CloseWebSocketFrame后,SimpleChannelInboundHandler调用release时,会触发CloseWebSocketFrame.release() 我们再执行这个方法的时候可以看到底层源码里面才知道,他会自动吧 refCnt,置为0;但是我们有可能会把消息发送给两个不同的客户端,此时采用循环就会出现这个异常,循环再次进来时,refCnt已经置为0此时就会报错

具体实现方法里面 ReferenceCountUtil.release(msg);语句就是置零的语句。
解决办法
把SimpleChannelInboundHandler改成extends ChannelInboundHandlerAdapter
channelRead0改成channelRead
在有循环发送的先ReferenceCountUtil.retain(tws);增加1
然后等循环结束后再 ReferenceCountUtil.release(msg)释放置为0即可,否则会出现内存溢出的情况
看源码debug真的很重要,希望大家重视。在多线程下可能需要观察情况。暂未测试
本文探讨了在使用Netty处理WebSocket连接时遇到的异常情况,特别是在收到CloseWebSocketFrame后,由于引用计数机制导致的问题。解决方案是将SimpleChannelInboundHandler改为ChannelInboundHandlerAdapter,并在循环发送前使用ReferenceCountUtil.retain增加引用计数,循环结束后再释放。作者强调了阅读和理解源码的重要性,以及在多线程环境下可能需要注意的问题。


9470

被折叠的 条评论
为什么被折叠?



