簡體   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