日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java - 使用Netty Demo報錯

瀏覽:179日期:2023-12-24 15:20:14

問題描述

public class TimeServer { public void bind(int port) {try { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024) .childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel arg0) throws Exception { System.out.println('初始化'); arg0.pipeline().addLast(new TimeHandler());} }); ChannelFuture future = b.bind(port).sync(); System.out.println('執行這里'); future.channel().closeFuture().sync(); System.out.println('執行這里');} catch (InterruptedException e) { e.printStackTrace();} } public static void main(String[] args) {new TimeServer().bind(10000); }}public class TimeHandler extends ChannelInboundHandlerAdapter {@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {super.channelRead(ctx, msg); ByteBuf buf=(ByteBuf) msg;////byte[] butfs = buf.array();//報錯 System.out.println(buf.readableBytes());byte[] butfs = new byte[buf.readableBytes()];buf.readBytes(butfs);System.out.println(new String(butfs,'UTF-8'));System.out.println(msg); }}

客戶端使用的是BIO的模型:

public static void main(String[] args) throws Exception {final int port = 10000;//NioServer server = new NioServer(port);//server.init();/// ========================================================// 接下來模擬3個Client并發訪問服務器int poolsize = 1;ExecutorService pool = Executors.newFixedThreadPool(poolsize);Collection<Callable> tasks = new ArrayList<Callable>(10);final String clientname = 'clientThread';for (int i = 0; i < poolsize; i++) { final int n = i; // 若每一個Client都保持使用BIO方式發送數據到Server,并讀取數據。 tasks.add(new Callable() {@Overridepublic Object call() throws Exception { Socket socket = new Socket('127.0.0.1', port); final InputStream input = socket.getInputStream(); final OutputStream out = socket.getOutputStream(); final String clientname_n = clientname + '_' + n; // BIO讀取數據線程 new Thread(clientname_n + '_read') {@Overridepublic void run() { byte[] bs = new byte[1024]; while (true) {try { Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace();}int len = 0;try { while ((len = input.read(bs)) != -1) {System.out.println('Clinet thread ' + Thread.currentThread().getName()+ ' read: ' + new String(bs, 0, len)); }} catch (IOException e) { e.printStackTrace();} }} }.start(); // BIO寫數據線程 new Thread(clientname_n + '_write') {@Overridepublic void run() { int a = 0; while (true) {try { Thread.sleep(100);} catch (InterruptedException e) { e.printStackTrace();}String str = Thread.currentThread().getName() + ' hello, ' + a;try { out.write(str.getBytes()); out.flush(); a++;} catch (IOException e) { e.printStackTrace();} }} }.start(); return null;} });}pool.invokeAll((Collection<? extends Callable<Object>>) tasks);//server.go(); }

結果運行的時候出現了以下錯誤:

月 13, 2017 5:52:56 下午 io.netty.channel.DefaultChannelPipeline onUnhandledInboundException警告: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.io.netty.util.IllegalReferenceCountException: refCnt: 0 at io.netty.buffer.AbstractByteBuf.ensureAccessible(AbstractByteBuf.java:1408) at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1394) at io.netty.buffer.AbstractByteBuf.checkReadableBytes(AbstractByteBuf.java:1383) at io.netty.buffer.AbstractByteBuf.readBytes(AbstractByteBuf.java:850) at io.netty.buffer.AbstractByteBuf.readBytes(AbstractByteBuf.java:858) at test.netty.TimeHandler.channelRead(TimeHandler.java:17) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:624) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:559) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:476) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:438) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) at java.lang.Thread.run(Thread.java:745)

請問這是為什么呢?

問題解答

回答1:

在netty4中,對象的生命周期由引用計數器控制,ByteBuf就是如此,每個對象的初始化引用計數為1,調用一次release方法,引用計數器會減1,當嘗試訪問計數器為0的,對象時,會拋出IllegalReferenceCountException,正如ensureAccessible的實現,更加詳細的解釋可以參考官方文檔

AbstractByteBuf.java

protected final void ensureAccessible() {if (refCnt() == 0) { throw new IllegalReferenceCountException(0);} }

注意TZ的TimeHandler類中的 super.channelRead(ctx, msg);這行代碼。追蹤調用路徑,

private void invokeChannelRead(Object msg) {try { ((ChannelInboundHandler) handler()).channelRead(this, msg);} catch (Throwable t) { notifyHandlerException(t);} }

最終調用的代碼是:ReferenceCountUtil.release(msg)

public static boolean release(Object msg) {if (msg instanceof ReferenceCounted) { return ((ReferenceCounted) msg).release();}return false; }

也就是每次super.channelRead(ctx, msg);后,ByteBuf就會調用release()方法,計數器減一,然后在buf.readBytes(butfs);這行代碼就會校驗ensureAccessible(),計數器為0,netty認為ByteBuf對象已經釋放,就拋出異常。

解決方案:

去掉TimeHandler中這行代碼 super.channelRead(ctx, msg);ByteBuf對象誰處理誰釋放。

回答2:

An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.缺少exceptionCaught(),在在server端最后一個Handler中增加exceptionCaught()

標簽: java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品青草| 丝袜av一区| 日韩精品欧美| 欧美日韩三区| 国产欧美日韩一级| 日韩欧美一区二区三区免费看| 狠狠操综合网| 欧美日韩午夜电影网| 亚洲高清激情| 国产一精品一av一免费爽爽| 精品福利久久久| 亚洲免费观看高清完整版在线观| 欧美激情麻豆| 美女久久网站| 久久99久久人婷婷精品综合| 中文日韩在线| 伊伊综合在线| 亚洲色图国产| 视频一区欧美精品| 欧美亚洲国产激情| 97se亚洲| 日韩精品中文字幕吗一区二区| 日韩一区二区三区免费| 国产亚洲一区二区三区啪| 97精品一区| 精品视频一二| 国产欧美自拍| 99久久视频| 麻豆视频久久| 视频一区二区中文字幕| 一区二区三区四区日本视频| 亚洲精品伊人| 九色精品91| 日韩高清欧美| 久久精品网址| 91欧美日韩在线| 久久国产精品毛片| 亚洲一级网站| 亚洲精品在线影院| 精品国产一区二区三区性色av| 少妇精品久久久一区二区| 美女网站一区| 蜜桃视频在线网站| 高清日韩欧美| 国产精品日韩精品中文字幕| 亚洲精品国模| 亚洲久久在线| 综合激情五月婷婷| 亚洲一区av| 免费人成在线不卡| 三级亚洲高清视频| 视频在线观看91| 日韩在线观看一区二区| 亚洲深夜影院| 三级亚洲高清视频| 在线免费观看亚洲| 综合国产视频| 亚洲aⅴ网站| 香蕉久久久久久| 水野朝阳av一区二区三区| 国内激情久久| 九九综合九九| 亚洲欧美日本国产专区一区| 国产精品三上| 中文字幕亚洲影视| 亚洲tv在线| 欧美一区成人| 久久精品国产99国产| 国产成人精品一区二区三区免费| 国产一区二区三区四区五区| 国产不卡人人| 精品日韩毛片| 免费久久精品视频| 日本特黄久久久高潮| 久久精品超碰| 精品资源在线| 久久精品影视| 免费国产亚洲视频| 国产欧美日韩一区二区三区四区| 欧美成a人片免费观看久久五月天| 精品久久电影| 国产一在线精品一区在线观看| 午夜视频精品| 亚洲精品乱码| 国产高清亚洲| 亚洲一级少妇| 免费观看久久久4p| 国产精品一区二区三区av麻| 精品日本视频| 欧美成人精品三级网站| 亚洲精品中文字幕乱码| 婷婷综合成人| 国产精品成人a在线观看| 91高清一区| 亚洲视频二区| 精品国产亚洲一区二区三区在线| 播放一区二区| 伊人精品久久| 国产一区二区三区日韩精品| 国产精品88久久久久久| 日韩av电影一区| 秋霞影院一区二区三区| 免费观看在线色综合| 国产精品一区2区3区| 在线看片福利| 日韩一二三区在线观看| 97精品国产一区二区三区 | 蜜桃av一区二区三区电影| 国产精品久久| 六月丁香综合| 国产va在线视频| 日本成人在线不卡视频| 亚洲精品88| 91免费精品国偷自产在线在线| 久久三级福利| 国产激情欧美| 亚洲人成网77777色在线播放 | 色在线中文字幕| 日韩精品中文字幕一区二区| 欧美日韩一区二区三区视频播放| 国产欧美日韩精品高清二区综合区| 激情欧美丁香| 国产精品99在线观看| 日韩美女精品| 亚洲少妇在线| 久久久久久久久丰满| 欧美激情五月| 久久激情av| 亚洲婷婷丁香| 亚洲少妇在线| 日韩成人三级| 老鸭窝一区二区久久精品| 中文字幕中文字幕精品| 欧美va亚洲va日韩∨a综合色| 精品久久精品| 欧美黄色一区| 欧美久久精品| 日韩精品久久久久久久软件91| 国产精品老牛| 国产一区二区三区自拍| 亚洲啊v在线| 精品国产精品国产偷麻豆| 日韩二区三区四区| 中文无码日韩欧| 国产精品婷婷| 国产综合亚洲精品一区二| 美女久久久久久| 欧美激情网址| 欧美激情99| 久久三级毛片| 精品视频免费| 国产一区三区在线播放| 久久精品人人| 国产精品原创| 久久电影tv| 日韩欧美在线中字| 日韩高清中文字幕一区二区| 成人亚洲欧美| 九色porny丨国产首页在线| 国产精品福利在线观看播放| 91亚洲一区| 日韩欧美1区| 成人看片网站| 黄色av日韩| 日韩中文字幕1| 亚洲18在线| 欧美日韩亚洲国产精品| 久久超级碰碰| 伊人久久av| 五月天激情综合网| 免费在线看一区| 欧美综合精品| 国产一区丝袜| 激情久久久久久久| 国产一区91| 日本在线不卡视频一二三区| 亚洲精品欧美| 欧美韩一区二区| 福利在线免费视频| 91超碰国产精品| 日韩欧美中文字幕一区二区三区| 国产日韩亚洲| 精品捆绑调教一区二区三区| 99香蕉国产精品偷在线观看| 一本一道久久a久久| 国产精品欧美一区二区三区不卡| 精品一区二区三区免费看| 午夜精品成人av| 亚洲精品午夜av福利久久蜜桃| 亚洲精品第一| 精品国产成人| 久久视频精品| 日韩欧美三区| 国产精品麻豆久久| 午夜在线视频观看日韩17c| 欧美一级二级视频| 欧洲av不卡| 色综合视频一区二区三区日韩 | 精品国产精品国产偷麻豆| 91精品国产乱码久久久久久久|