在netty中,我们如何发送不同长度的字符串消息?

时间:2016-07-14 19:33:17

标签: java netty

我想通过netty发送字符串消息。为此,我需要使用StringDecoder和编码器,如下所示:

 ch.pipeline().addLast("frameDecoder", new LineBasedFrameDecoder(**maxLength**)); 
                 ch.pipeline().addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8));

                 // Encoder
                 ch.pipeline().addLast("stringEncoder", new StringEncoder(CharsetUtil.UTF_8));

这很好,但唯一让我对maxLengh感到失望的部分?!我不知道我的字符串消息的最大大小?为什么需要它,它可以通过分隔符找到字符串或\ r \ n为什么它需要maxLength?

有没有办法发送字符串消息而不指定长度?顺便说一句,如果我将限制设置为大数,并且只使用一小部分,我会丢失任何东西吗?我在浪费空间吗?

我正在编写一个分布式键值存储,我的系统中的服务器会互相复制新的写入,我不知道一个键的值有多大。

由于

2 个答案:

答案 0 :(得分:0)

一切都有一个开始必须结束。如果没有LF发送到服务器怎么办?这就是为什么有一个最大长度。我相信在设计这种系统时你应该设置一个行长限制。

如果设置一个非常大的数字,并且只接收短行,则不会浪费空间。

答案 1 :(得分:0)

我找到了另一篇可用于发送字符串的帖子: Netty channel.write not writing message

所以使用那里建议的方法,我提出了这个解决方案,但是如果效率很高的话,我就不会这样做。

发送:

 String str = "Hello";
 ctx.writeAndFlush(Unpooled.copiedBuffer(str, CharsetUtil.UTF_8)); // (3)

收到:

我首先在类中将StringBuffer定义为成员:

StringBuffer sBuf = new StringBuffer("");

然后在channelRead中我会:

public void channelRead(ChannelHandlerContext ctx, Object msg) {
    System.out.println("Inside channelRead");
    ByteBuf in = (ByteBuf) msg;
    while (in.isReadable()) {
        byte b = in.readByte();
        char c = (char)b;
        System.out.print(c);
        if (c == '\n') {
            System.out.println("Client received: " + sBuf.toString());
            sBuf = new StringBuffer("");
        } else {

            sBuf.append(c);
        }
    }

    ctx.close();
    in.release();
}

我知道,它看起来效率不高,但是我检查了我以前在传统方式中使用的BufferReader的readLine()方法的java代码: http://developer.classpath.org/doc/java/io/BufferedReader-source.html

我认为这是做同样的事情(我不喜欢)它使用StringBuffer和append方法,虽然它看起来很复杂,但也许这比我的简单想法更有效:p

那么你们有什么关系?我测试过,它运行正常,唯一关心的是效率。