繁体   English   中英

在Netty中发送字节数组

[英]Sending byte array in Netty

我正在使用LengthFieldBasedFrameDecoder来发送和接收byte[]但是客户端在写入后会收到错误java.nio.channels.ClosedChannelException

这是管道工厂;

@Override
public ChannelPipeline getPipeline() throws Exception {

    String charSet = EvamProperties.charSet.get();
    ChannelPipeline pipeline = Channels.pipeline();

    pipeline.addLast("framer", new LengthFieldBasedFrameDecoder(1000000,0,4,0,4));//16KB
    pipeline.addLast("decoder", new OneToOneDecoder() {
        @Override
        protected Object decode(ChannelHandlerContext channelHandlerContext, Channel channel, Object o) throws Exception {

            if (!(o instanceof ChannelBuffer)) {
                return o;
            }

            ChannelBuffer buffer = (ChannelBuffer) o;

            int length = buffer.readInt();
            byte[] bytes = new byte[length];
            buffer.readBytes(bytes);

            return bytes;
        }
    });
    pipeline.addLast("encoder", new OneToOneEncoder() {
        @Override
        protected Object encode(ChannelHandlerContext channelHandlerContext, Channel channel, Object o) throws Exception {

            if(!(o instanceof byte[])) {
                return o;
            }

            ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
            buffer.writeInt(((byte[]) o).length);
            buffer.writeBytes((byte[])o);

            return buffer;
        }
    });
    pipeline.addLast("handler", new RawEventServerHandler());
    return pipeline;

}

客户以这种方式写它;

channel.write(eventStr.getBytes());

在这个用于调试的代码中,要发送的数据是String但我不能使用StringDecoder。

LenghtFieldBasedDecoder是否是发送和接收byte[]正确方法,如果没有,我该怎么办?

编辑:

我发现另一个线程实际关闭了通道,因此解决了java.nio.channels.ClosedChannelException ,但我仍然渴望学习这类工作的最佳实践。

我根据您的问题看到了3个不同的用例:

  1. 传入的字节表示存储在帧中的某个特定length的帧,您需要将帧捕获为byte[length]并将其传输给用户
  2. 传入的字节表示固定length帧,您需要将帧捕获为byte[length]并将其传输给用户
  3. 传入的字节不代表任何帧,用户可以处理任何长度的byte[]数组

在(1) LengthFieldBasedFrameDecoder是正确的选择的情况下,它允许您基于存储在帧中的长度捕获帧。 在(2)的情况下,如果您知道所有帧具有相同的大小,则FixedLengthFrameDecoder应该足够了。 在(3)的情况下你不需要任何特殊的解码器,所有可读字节都可以从传入的ByteBuf获取并传输到下一个处理程序,但是我不确定在真实应用程序中这种方法有多么有用,因为很可能你是'处理某些特定类型/大小的消息,Netty不保证消息将如何分割,一条消息可以作为N个不同的块到达。

如果你想解码传入的字节并跳过捕获步骤,还有ReplayingDecoder对情况(1-2)很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM