通常引起异常的原因是因为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真的很重要,希望大家重视。在多线程下可能需要观察情况。暂未测试