我使用http://netty.io/wiki/user-guide-for-4.x.html链接编写了一个netty服务器。但我得到的数据只有16384字节。
public class DiscardServerHandler extends ChannelInboundHandlerAdapter
{
byte bNullArray[] = "".getBytes();
String strFullData= new String(bNullArray,StandardCharsets.UTF_8);
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
{
try
{
String MsgRead;
ByteBuf in = (ByteBuf) msg;
MsgRead=in.toString(io.netty.util.CharsetUtil.UTF_8);
// here I get data only upto 1024 and this method get called 16 times.
// So total data received is == 1024*16 = 16384
strFullData = strFullData + MsgRead;
}
finally
{
ReferenceCountUtil.release(msg);
}
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception
{
//WriteMyLog(strFullData);
//Here size of strFullData is 16384
strFullData = ProcessMyData(strFullData);
byte[] respByteBuf = strFullData.getBytes();
ByteBuf Resp1 = ctx.alloc().buffer(respByteBuf.length);
Resp1.writeBytes(respByteBuf);
ctx.write(Resp1);
ctx.flush();
ctx.close();
}
}
如何获取更多数据?
答案 0 :(得分:1)
当你的操作系统从套接字读取一些数据时,它会将它传递给用户空间(在你的情况下带有netty的Java)。 16 * 1024是您的操作系统从套接字读取而不是传递给您的缓冲区大小。这意味着如果您的邮件超过此大小,则ChannelInboundHandlerAdapter
处理程序不适合您的情况。您需要使用ByteToMessageDecoder
。类似的东西:
public class MyBigMessageDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
if (in.readableBytes() < MY_BIG_MESSAGE_SIZE) {
return;
}
out.add(in.readBytes(MY_BIG_MESSAGE_SIZE));
}
}
Netty还有一堆针对不同场景的现成处理程序,例如LineBasedFrameDecoder
,LengthFieldBasedFrameDecoder
,FixedLengthFrameDecoder
等。我相信你可以使用其中一些。
一般来说,它们都是一样的 - 继续读取收入字节,直到满足某些条件。准备好后 - 它们会进一步传递读取字节。