Hi Mr.Zhu
What a excellent explanation and thank you very much for your time . I
think I prefer scenario 2 , and need study more and try that . Once again
thank you
On Saturday, April 1, 2017 at 6:05:53 PM UTC+7, Zhu Ran wrote:
>
> Netty inside will use a piece of buffer to provide data for you when you
> read data from channel.
>
> The size of buffer is dynamic. Netty will change the size of buffer in
> this way:
>
> 1.the initial size would be small.
> 2.every time after you read the channel (means you read data from
> buffer),netty records the
> size of readable bytes in the buffer
> 3.if the size of readable bytes is less that the value of last time, netty
> would do nothing with
> the size of the buffer, because netty think you have read all data you
> need, and wait you
> reading again;
> 4.if the size of readable bytes equals to the value of last time, netty
> would enlarge the size of
> the buffer and fill it with data, because netty notices that you have the
> chance to read the data
> but you didn't read data, netty guess you want more data, so netty enlarge
> the buffer and fill
> with more fresh data.
>
> So, what you would actually do is not to read from the buffer if the
> readableBytes is less than you want.
>
> there are two scenarios:
> 1) the size of the data you want is a constant value:
> In this scenario, you just compare the readableBytes to the constant
> value. if the data is not enough, you do nothing, just return; if the
> data
> is enough, you read it and do what you want
>
> 2)the size of the data you want is encoded in the fist several bytes of
> data( just as many
> protocal)
> you can use FixedLengthFrameDecoder to do the stuff.
> if FixedLengthFrameDecoder is not satisfied you, you can do some thing
> like that when
> reading the channel:
> a)mark the reader index
> b)read the first several bytes, and calculate the length of the
> data you want
> c)if the readableBytes is enough, read it and do what you want
> d)if the readableBytes is not enough, reset the reader index(to
> tell netty that you don't read the data)
>
> Talk is cheap, show you code.
>
> A way to handle this is to use ByteToMessageDecoder.
> Extend it and override ByteToMessageDecoder's decode method.
>
> To solve scenario 1):
>
>
> @Override
> protected void decode(ChannelHandlerContext ctx, ByteBuf in,
> List<Object> out) throws Exception {
> int LENGTH = 200000;
> if (in.readableBytes() < LENGTH)
> return;
> else {
> byte[] bytes = new byte[LENGTH];
> in.readBytes(bytes , 0, LENGTH);
> //do stuff...
> }
> }
>
>
> To solve scenario 2):
>
> @Override
> protected void decode(ChannelHandlerContext ctx, ByteBuf in,
> List<Object> out) throws Exception {
>
> int LENGTH_SIZE = 4;
> byte[] lengthBytes = new byte[LENGTH_SIZE ];
> in.markReaderIndex().readBytes(lengthBytes, 0, LENGTH_SIZE );
> int length = Bits.toInt(lengthBytes);
> if (in.readableBytes() >= length) {
> byte[] content = new byte[length];
> in.readBytes(content, 0, length);
> //do some stuff
> } else {
> in.resetReaderIndex();
> }
> }
>
>
>
> On Friday, March 31, 2017 at 12:27:43 PM UTC+8, Mohd rully k wrote:
>>
>> Hii , first sorry if my post in the wrong place , I'm newbie and my
>> English not good . So , i have project that require to read socket from
>> coldfusion 7 , and I have succeed using standard thread and port listening
>> . Now I'm try using netty for best speed and response .
>>
>> This is my listener ,
>>
>> public class NettyListener {
>>
>> private final int port;
>>
>> public NettyListener(int port) {
>> this.port = port;
>> }
>>
>> public void start() throws Exception {
>> NioEventLoopGroup group = new NioEventLoopGroup();
>> try {
>> ServerBootstrap b = new ServerBootstrap();
>> b.group(group)
>> .channel(NioServerSocketChannel.class)
>> .localAddress(new InetSocketAddress(port))
>> .childHandler(new ChannelInitializer<SocketChannel>() {
>> @Override
>> public void initChannel(SocketChannel ch)
>> throws Exception {
>> ch.pipeline().addLast(new NettyHandler());
>> }
>> }).option(ChannelOption.SO_BACKLOG, 128)
>> .childOption(ChannelOption.SO_KEEPALIVE, true);
>> ;
>>
>> ChannelFuture f = b.bind().sync();
>> // System.out.println(NettyListener.class.getName()
>> // + " started and listen on " + f.channel().localAddress());
>> f.channel().closeFuture().sync();
>> } finally {
>> group.shutdownGracefully().sync();
>> }
>> }
>> }
>>
>> and this is my handler
>> @Sharable
>> public class NettyHandler extends ChannelInboundHandlerAdapter {
>>
>> private static String raw;
>> String inputLine = null;
>>
>> @Override
>> public void channelRead(ChannelHandlerContext ctx, Object msg) {
>> ByteBuf in = (ByteBuf) msg;
>> inputLine = in.toString(CharsetUtil.UTF_8);
>> int u = 1;
>> String lines[] = inputLine.split("[\\r\\n]+");
>> for (String i : lines) {
>> if (u == 6) { //this where data place normally
>> String converT;
>> converT = i.replace("%20", " ").replace("%2E", ".")
>> .replace("%2F", "/").replace("%2D", "-")
>> .replace("%40", "@").replace("%2B", "+")
>> .replace("%28", "(").replace("%29", ")")
>> .replace("%2C", ",").replace("%5F", "_");
>> setRaw(converT);
>> }
>> u++;
>> }
>> // ctx.write(in);
>> }
>>
>> @Override
>> public void channelReadComplete(ChannelHandlerContext ctx) throws
>> Exception {
>> ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(
>> ChannelFutureListener.CLOSE);
>> }
>>
>> @Override
>> public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
>> cause.printStackTrace();
>> ctx.close();
>> }
>>
>> public static String getRaw() {
>> return raw;
>> }
>>
>> public void setRaw(String raw) {
>> NettyHandler.raw = raw;
>> }
>>
>> }
>>
>>
>> The problem is when data/message to long, the data will split into 2
>> object or more . Is there a way to compact this data/message becoming 1
>> String java .
>>
>> Thank in advance
>>
>> Regards
>>
>> Rully
>>
>
--
You received this message because you are subscribed to the Google Groups
"Netty discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/netty/dc735ab2-54ae-4728-81ab-4b108526a251%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.