Netty sample

来源:互联网 发布:java实现日志服务 编辑:程序博客网 时间:2024/05/23 01:17

Echo

============= Echo client handler
channelActive
channelRead ,1446776210948
channelReadComplete
channelRead ,1446776210949
channelReadComplete
channelRead ,1446776210949
channelReadComplete
channelRead ,1446776210950
channelReadComplete
channelRead ,1446776210950
channelReadComplete

======= telnet

EchoServer wangliang$ telnet 127.0.0.1 8007
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
haha
haha
yes
yes
======= 修改让一个telent输入的内容在其他telnet中都回显

做法一:
用数组保存 ctx, 在read时调用所有的ctx.write
@Sharablepublic class EchoServerHandler extends ChannelHandlerAdapter {    static ArrayList<ChannelHandlerContext> ctxlist = new ArrayList<ChannelHandlerContext>();    private void read(Object msg) {        for(ChannelHandlerContext ctx : ctxlist) {            ctx.write(msg);        }    }    @Override    public void channelActive(ChannelHandlerContext ctx) throws Exception {        super.channelActive(ctx);        ctxlist.add(ctx);        System.out.println("channelActive ," + ctx);    }    @Override    public void channelRead(ChannelHandlerContext ctx, Object msg) {//        System.out.println("channelRead");        ctx.write(msg);        read(msg);    }

从报错可以看到,flash后会去做release byteBuf.与前文描述相符。

Nov 06, 2015 11:31:24 AM io.netty.util.ReferenceCountUtil safeRelease
警告: Failed to release a message: SimpleLeakAwareByteBuf(PooledUnsafeDirectByteBuf(freed))
io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
at io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:111)
at io.netty.buffer.WrappedByteBuf.release(WrappedByteBuf.java:832)
at io.netty.buffer.SimpleLeakAwareByteBuf.release(SimpleLeakAwareByteBuf.java:44)
at io.netty.util.ReferenceCountUtil.release(ReferenceCountUtil.java:84)
at io.netty.util.ReferenceCountUtil.safeRelease(ReferenceCountUtil.java:109)
at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:258)
at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:334)
at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:316)
at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:837)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:298)
at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:806)
at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1283)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeFlushNow(ChannelHandlerInvokerUtil.java:166)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeFlush(DefaultChannelHandlerInvoker.java:355)
at io.netty.channel.PausableChannelEventExecutor.invokeFlush(PausableChannelEventExecutor.java:46)
at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:546)
at io.netty.example.echo.EchoServerHandler.channelReadComplete(EchoServerHandler.java:55)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadCompleteNow(ChannelHandlerInvokerUtil.java:92)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelReadComplete(DefaultChannelHandlerInvoker.java:167)
at io.netty.channel.PausableChannelEventExecutor.invokeChannelReadComplete(PausableChannelEventExecutor.java:91)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelReadComplete(AbstractChannelHandlerContext.java:412)
at io.netty.channel.DefaultChannelPipeline.fireChannelReadComplete(DefaultChannelPipeline.java:962)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:150)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:514)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:471)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:385)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:351)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at io.netty.util.internal.chmv8.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1412)
at io.netty.util.internal.chmv8.ForkJoinTask.doExec(ForkJoinTask.java:280)
at io.netty.util.internal.chmv8.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:877)
at io.netty.util.internal.chmv8.ForkJoinPool.scan(ForkJoinPool.java:1706)
at io.netty.util.internal.chmv8.ForkJoinPool.runWorker(ForkJoinPool.java:1661)
at io.netty.util.internal.chmv8.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:126)
0 0
原创粉丝点击