问答详情
源自:5-4 WebSocket连接业务的实现

老师的源代码启动之后一旦刷新网页,或者关闭网页,就会抛异常,请问如何解决它?

源代码虽然可以正常使用,发消息也没问题。但是启动网页后,一刷新网页或者关闭网页,就会抛异常:

*******************************************************************************************************************

目前我们不支持二进制消息

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)

客户端与服务端连接开启...

****************************************************************************************************************************

请问一下异常的原因,以及如何解决异常。


提问者:tqz啊 2018-09-17 16:35

个回答

  • qq_慕UI0538935
    2019-03-20 10:43:45

    刚刚突然间发现,在判断是否为CloseWebSocketFrame的时候,如果是CloseWebSocketFrame并没有return,也就是程序将会继续往下运行,然后又判断如果不是TextWebSocketFrame自然就抛异常,所以正解应该是在判断CloseWebSocketFrame时,如果是,加上return即可。

  • qq_慕UI0538935
    2019-03-20 10:29:47

    这个地方判断二进制消息的方法是 如果不是 CloseWebSocketFrame PingWebSocketFrame 和 TextWebSocketFrame 就是 二进制消息,所以我猜测应该服务器刷新之类的操作会发送这么一个消息吧?

  • tqz啊
    2018-09-17 16:44:32

    我肯定知道老师写了抛异常的语句,所以才抛异常。但是不支持二进制是啥意思?

  • tqz啊
    2018-09-17 16:42:31

    我尝试着把代码修改为这样,然后就不报错了。但是。。。why??

    //判断是否是二进制消息
    if (!(frame instanceof TextWebSocketFrame)) {
        System.out.println("目前我们不支持二进制消息");
        ctx.channel().write(new PongWebSocketFrame(frame.content().retain()));
        return;
    }

  • tqz啊
    2018-09-17 16:35:49

    还有为什么说不支持二进制?