1 自定义协议
Headers { //目标类 private byte cls; //效验码 private byte msgCrc = 0x01; //全局回话id private long msgSessionId; //消息长度,包括头部 private int msgLength; //消息类型 private byte msgType;
}
Messages { Headers ; Object ; Object getBody() { ; } }
2 encoder
Encoder MessageToByteEncoder<Messages> { MessagePack ; [] ; encode(ChannelHandlerContext ctx, Messages msgs, ByteBuf out) Exception { = MessagePack(); (msgs == || msgs.getHeaders() == ) { Exception(); } = .write(msgs.getBody()); out.writeByte(msgs.getHeaders().getMsgCrc()); out.writeByte(msgs.getHeaders().getCls()); out.writeInt(.); out.writeByte(msgs.getHeaders().getMsgType()); (msgs.getBody() != ) { out.writeBytes(); } } }
3 decoder
Decoder ByteToMessageDecoder { Logger = LoggerFactory.(.getClass().getName()); MessagePack ; Messages ; Headers ; Class ; decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) Exception { = MessagePack(); = Messages(); = Headers(); msgCrc = in.readByte(); cl = in.readByte(); lg = in.readInt(); (msgCrc != Tools.) { .debug(); ; } (in.readableBytes() < lg) { in.resetReaderIndex(); ; } in.markReaderIndex(); .setMsgCrc(msgCrc); .setCls(cl); .setMsgLength(lg); .setMsgType(in.readByte()); (cl == ) { = DictClass.; } [] array; length = in.readableBytes(); array = [length]; in.getBytes(in.readerIndex(), array, , length); .setBody(.read(array, )); .setHeaders(); out.add(); } }
4 server
ChildChannelHander ChannelInitializer<SocketChannel> { initChannel(SocketChannel ch) Exception { ch.pipeline().addLast(Encoder()); ch.pipeline().addLast(Decoder()); ch.pipeline().addLast(FlowerpotLoginServiceHandlers()); .debug(); } }
5 client
(ChannelInitializer<SocketChannel>() { initChannel(SocketChannel ch) Exception { ch.pipeline().addLast(Encoder()); ch.pipeline().addLast(Decoder()); ch.pipeline().addLast(FlowerpotLoginClientHandlers()); .debug(); } }
错误信息:
15:04:22.650 [nioEventLoopGroup-1-6] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(34) + length(1) exceeds writerIndex(34): PooledUnsafeDirectByteBuf(ridx: 34, widx: 34, cap: 34)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:347) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:272) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelInactiveNow(ChannelHandlerInvokerUtil.java:56) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelInactive(DefaultChannelHandlerInvoker.java:92) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.PausableChannelEventExecutor.invokeChannelInactive(PausableChannelEventExecutor.java:71) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:366) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:295) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelInactiveNow(ChannelHandlerInvokerUtil.java:56) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelInactive(DefaultChannelHandlerInvoker.java:92) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.PausableChannelEventExecutor.invokeChannelInactive(PausableChannelEventExecutor.java:71) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:366) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:938) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:680) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:328) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.util.internal.chmv8.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1412) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.util.internal.chmv8.ForkJoinTask.doExec(ForkJoinTask.java:280) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.util.internal.chmv8.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:877) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.util.internal.chmv8.ForkJoinPool.scan(ForkJoinPool.java:1706) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.util.internal.chmv8.ForkJoinPool.runWorker(ForkJoinPool.java:1661) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.util.internal.chmv8.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:126) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
Caused by: java.lang.IndexOutOfBoundsException: readerIndex(34) + length(1) exceeds writerIndex(34): PooledUnsafeDirectByteBuf(ridx: 34, widx: 34, cap: 34)
at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1138) ~[netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.buffer.AbstractByteBuf.readByte(AbstractByteBuf.java:542) ~[netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at io.netty.buffer.WrappedByteBuf.readByte(WrappedByteBuf.java:423) ~[netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
at com.senhe.flowerpots.service.coder.Decoder.decode(Decoder.java:39) ~[classes/:na]
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:316) [netty-all-5.0.0.Alpha2.jar:5.0.0.Alpha2]
... 21 common frames omitted