首先我们得先弄清楚websocket和tcpSocket的区别。websocket也是基于tcp的应用层协议,只是在传统的socket上进行了封装。
然后我们要知道netty的handle支持动态增删。
综上所述,相信脑海里已经有对应的方案了。那就是动态设置编解码处理器。
关键代码如下:
// 1.socket方式服务 // 设置N秒没有读到数据,则触发一个READER_IDLE事件。 pipeline.addLast(new IdleStateHandler(readerIdleTime,0,0, TimeUnit.SECONDS)); pipeline.addLast("active",new ChannelActiveHandle()); pipeline.addLast("socketChoose",new SocketChooseHandle()); //tcpsocket编码解码handle,如果是websocket链接,会将其删除 pipeline.addLast("lengthEncode",new LengthFieldPrepender(4, false)); pipeline.addLast("lengthDecoder",new LengthFieldBasedFrameDecoder(2000, 0, 4,0, 4)); pipeline.addLast(bytebufToByteHandle); //因为接收类型的泛型不对,所以在websocket握手的时候不会进入该handle //此handle为最后的socket消息分解,web和tcp通用 pipeline.addLast("byteToBuf",byteToByteBufHandle); pipeline.addLast("protocolResolve",protocolResolveHandle);