More convenient inbound stream handler / Smarter inbound buffer cleanup
- Added a new convenience method to ChannelInboundstreamHandlerAdapter - EchoServerHandler uses the new method - DefaultChannelPipeline calls inboundByteBuffer.discardReadBytes() when it is sure there's no memory copy involved
This commit is contained in:
parent
665777e6f9
commit
2a63acef4d
@ -22,8 +22,6 @@ import io.netty.channel.ChannelOption;
|
|||||||
import io.netty.channel.socket.SocketChannel;
|
import io.netty.channel.socket.SocketChannel;
|
||||||
import io.netty.channel.socket.nio.NioEventLoop;
|
import io.netty.channel.socket.nio.NioEventLoop;
|
||||||
import io.netty.channel.socket.nio.NioSocketChannel;
|
import io.netty.channel.socket.nio.NioSocketChannel;
|
||||||
import io.netty.handler.logging.LogLevel;
|
|
||||||
import io.netty.handler.logging.LoggingHandler;
|
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
|
||||||
@ -57,7 +55,7 @@ public class EchoClient {
|
|||||||
@Override
|
@Override
|
||||||
public void initChannel(SocketChannel ch) throws Exception {
|
public void initChannel(SocketChannel ch) throws Exception {
|
||||||
ch.pipeline().addLast(
|
ch.pipeline().addLast(
|
||||||
new LoggingHandler(LogLevel.INFO),
|
//new LoggingHandler(LogLevel.INFO),
|
||||||
new EchoClientHandler(firstMessageSize));
|
new EchoClientHandler(firstMessageSize));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -58,7 +58,7 @@ public class EchoServer {
|
|||||||
@Override
|
@Override
|
||||||
public void initChannel(SocketChannel ch) throws Exception {
|
public void initChannel(SocketChannel ch) throws Exception {
|
||||||
ch.pipeline().addLast(
|
ch.pipeline().addLast(
|
||||||
new LoggingHandler(LogLevel.INFO),
|
//new LoggingHandler(LogLevel.INFO),
|
||||||
new EchoServerHandler());
|
new EchoServerHandler());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -16,10 +16,8 @@
|
|||||||
package io.netty.example.echo;
|
package io.netty.example.echo;
|
||||||
|
|
||||||
import io.netty.buffer.ChannelBuffer;
|
import io.netty.buffer.ChannelBuffer;
|
||||||
import io.netty.channel.ChannelBufferHolder;
|
|
||||||
import io.netty.channel.ChannelBufferHolders;
|
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
|
||||||
import io.netty.channel.ChannelInboundHandlerContext;
|
import io.netty.channel.ChannelInboundHandlerContext;
|
||||||
|
import io.netty.channel.ChannelInboundStreamHandlerAdapter;
|
||||||
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@ -27,23 +25,16 @@ import java.util.logging.Logger;
|
|||||||
/**
|
/**
|
||||||
* Handler implementation for the echo server.
|
* Handler implementation for the echo server.
|
||||||
*/
|
*/
|
||||||
public class EchoServerHandler extends ChannelInboundHandlerAdapter<Byte> {
|
public class EchoServerHandler extends ChannelInboundStreamHandlerAdapter {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(
|
private static final Logger logger = Logger.getLogger(
|
||||||
EchoServerHandler.class.getName());
|
EchoServerHandler.class.getName());
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChannelBufferHolder<Byte> newInboundBuffer(ChannelInboundHandlerContext<Byte> ctx) {
|
public void inboundBufferUpdated(ChannelInboundHandlerContext<Byte> ctx, ChannelBuffer in) {
|
||||||
return ChannelBufferHolders.byteBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void inboundBufferUpdated(ChannelInboundHandlerContext<Byte> ctx) {
|
|
||||||
ChannelBuffer in = ctx.inbound().byteBuffer();
|
|
||||||
ChannelBuffer out = ctx.nextOutboundByteBuffer();
|
ChannelBuffer out = ctx.nextOutboundByteBuffer();
|
||||||
out.discardReadBytes();
|
out.discardReadBytes();
|
||||||
out.writeBytes(in);
|
out.writeBytes(in);
|
||||||
in.discardReadBytes();
|
|
||||||
ctx.flush();
|
ctx.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package io.netty.channel;
|
package io.netty.channel;
|
||||||
|
|
||||||
|
import io.netty.buffer.ChannelBuffer;
|
||||||
|
|
||||||
|
|
||||||
public class ChannelInboundStreamHandlerAdapter extends ChannelInboundHandlerAdapter<Byte> {
|
public class ChannelInboundStreamHandlerAdapter extends ChannelInboundHandlerAdapter<Byte> {
|
||||||
@Override
|
@Override
|
||||||
@ -7,4 +9,16 @@ public class ChannelInboundStreamHandlerAdapter extends ChannelInboundHandlerAda
|
|||||||
ChannelInboundHandlerContext<Byte> ctx) throws Exception {
|
ChannelInboundHandlerContext<Byte> ctx) throws Exception {
|
||||||
return ChannelBufferHolders.byteBuffer();
|
return ChannelBufferHolders.byteBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inboundBufferUpdated(ChannelInboundHandlerContext<Byte> ctx)
|
||||||
|
throws Exception {
|
||||||
|
inboundBufferUpdated(ctx, ctx.inbound().byteBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void inboundBufferUpdated(ChannelInboundHandlerContext<Byte> ctx, ChannelBuffer in)
|
||||||
|
throws Exception {
|
||||||
|
ctx.nextInboundByteBuffer().writeBytes(in);
|
||||||
|
in.discardReadBytes();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -740,6 +740,11 @@ public class DefaultChannelPipeline implements ChannelPipeline {
|
|||||||
((ChannelInboundHandler<Object>) ctx.handler()).inboundBufferUpdated(ctx);
|
((ChannelInboundHandler<Object>) ctx.handler()).inboundBufferUpdated(ctx);
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
notifyHandlerException(t);
|
notifyHandlerException(t);
|
||||||
|
} finally {
|
||||||
|
ChannelBufferHolder<Object> inbound = ctx.inbound();
|
||||||
|
if (inbound.isEmpty() && inbound.hasByteBuffer()) {
|
||||||
|
inbound.byteBuffer().discardReadBytes();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user