源代码虽然可以正常使用,发消息也没问题。但是启动网页后,一刷新网页或者关闭网页,就会抛异常:
*******************************************************************************************************************
目前我们不支持二进制消息
java.lang.RuntimeException: 【com.imooc.netty.websocket.MyWebSocketHandler】不支持消息
客户端与服务端连接关闭...
at com.imooc.netty.websocket.MyWebSocketHandler.handWebsocketFrame(MyWebSocketHandler.java:104)
at com.imooc.netty.websocket.MyWebSocketHandler.messageReceived(MyWebSocketHandler.java:80)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:103)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:320)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:154)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:74)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:138)
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:320)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:127)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:485)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:452)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:346)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:794)
at java.lang.Thread.run(Thread.java:745)
客户端与服务端连接开启...
****************************************************************************************************************************
请问一下异常的原因,以及如何解决异常。
刚刚突然间发现,在判断是否为CloseWebSocketFrame的时候,如果是CloseWebSocketFrame并没有return,也就是程序将会继续往下运行,然后又判断如果不是TextWebSocketFrame自然就抛异常,所以正解应该是在判断CloseWebSocketFrame时,如果是,加上return即可。
这个地方判断二进制消息的方法是 如果不是 CloseWebSocketFrame PingWebSocketFrame 和 TextWebSocketFrame 就是 二进制消息,所以我猜测应该服务器刷新之类的操作会发送这么一个消息吧?
我肯定知道老师写了抛异常的语句,所以才抛异常。但是不支持二进制是啥意思?
我尝试着把代码修改为这样,然后就不报错了。但是。。。why??
//判断是否是二进制消息 if (!(frame instanceof TextWebSocketFrame)) { System.out.println("目前我们不支持二进制消息"); ctx.channel().write(new PongWebSocketFrame(frame.content().retain())); return; }
还有为什么说不支持二进制?