我想通过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?
有没有办法发送字符串消息而不指定长度?顺便说一句,如果我将限制设置为大数,并且只使用一小部分,我会丢失任何东西吗?我在浪费空间吗?
我正在编写一个分布式键值存储,我的系统中的服务器会互相复制新的写入,我不知道一个键的值有多大。
由于
答案 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
那么你们有什么关系?我测试过,它运行正常,唯一关心的是效率。