admin 管理员组

文章数量: 1184232


2023年12月23日发(作者:curle)

@Override protected void doOpen() throws Throwable{ bootstrap = new ServerBootstrap(); bossGroup = oopGroup(1, "NettyServerBoss"); workerGroup = oopGroup( getUrl().getPositiveParameter(IO_THREADS_KEY, T_IO_THREADS), "NettyServerWorker"); final NettyServerHandler nettyServerHandler = new NettyServerHandler(getUrl(), this); channels = nnels(); (bossGroup, workerGroup) .channel(SocketChannelClass()) .option(_REUSEADDR, ) .childOption(_NODELAY, ) .childOption(TOR, T) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) throws Exception { // FIXME: should we use getTimeout()? int idleTimeout = eTimeout(getUrl()); NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec(), getUrl(), ); if (getUrl().getParameter(SSL_ENABLED_KEY, false)) { ne().addLast("negotiation", verHandler(getUrl(), nettyServerHandler)); } ne() //我们看到此处为解码 .addLast("decoder", oder()) //我们看到此处为编码 .addLast("encoder", oder()) .addLast("server-idle-handler", new IdleStateHandler(0, 0, idleTimeout, MILLISECONDS)) .addLast("handler", nettyServerHandler); } }); // bind ChannelFuture channelFuture = (getBindAddress()); interruptibly(); channel = l(); }客户端

final public class NettyCodecAdapter { private final ChannelHandler encoder = new InternalEncoder(); private final ChannelHandler decoder = new InternalDecoder();

public ChannelHandler getEncoder() { return encoder; } public ChannelHandler getDecoder() { return decoder; }

private class InternalDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf input, List out) throws Exception { ChannelBuffer message = new NettyBackedChannelBuffer(input); NettyChannel channel = ddChannel(l(), url, handler); // decode object. do { int saveReaderIndex = Index(); Object msg = (channel, message); if (msg == _MORE_INPUT) { Index(saveReaderIndex); break; } else { //is it possible to go here ? if (saveReaderIndex == Index()) { throw new IOException("Decode without read data."); } if (msg != null) { (msg); } } } while (le()); } }}我们先看编码部分

TF(orMessage()); } uffer(); if (out instanceof Cleanable) { ((Cleanable) out).cleanup(); } (); (); //响应的数据包长度 int len = nBytes(); checkPayload(channel, len); 2bytes(len, header, 12); // write Index(savedWriteIndex); ytes(header); // write header. Index(savedWriteIndex + HEADER_LENGTH + len); } catch (Throwable t) { // clear buffer Index(savedWriteIndex); // send error message to Consumer, otherwise, Consumer will wait till timeout. if (!t() && tus() != _RESPONSE) { Response r = new Response((), sion()); tus(_RESPONSE); if (t instanceof ExceedPayloadLimitException) { (sage(), t); try { orMessage(sage()); (r); return; } catch (RemotingException e) { ("Failed to send bad_response info back: " + sage() + ", cause: " + sage(), e); } } else { // FIXME log error message in Codec and handle in caught() of IoHanndler? ("Fail to encode response: " + res + ", send bad_response info instead, cause: " + sage(), t); try { orMessage("Failed to send response: " + res + ", cause: " + ng(t)); (r); return; } catch (RemotingException e) { ("Failed to send bad_response info back: " + res + ", cause: " + sage(), e); } } } // Rethrow exception if (t instanceof IOException) { throw (IOException) t; } else if (t instanceof RuntimeException) { throw (RuntimeException) t; } else if (t instanceof Error) { throw (Error) t; } else { throw new RuntimeException(sage(), t); } } }

// decode response.

如果是响应信息 Response res = new Response(id); if ((flag & FLAG_EVENT) != 0) { //是否是event事件 nt(true); } // get status.

获取响应的状态 byte status = header[3]; tus(status); try { if (status == ) {//如果是 OK状态 Object data; if (t()) { //如果是事件响应 ObjectInput in = alize((), is, proto); data = decodeEventData(channel, in); } else { DecodeableRpcResult result; if (().getParameter(DECODE_IN_IO_THREAD_KEY, DEFAULT_DECODE_IN_IO_THREAD)) { result = new DecodeableRpcResult(channel, res, is, (Invocation) getRequestData(id), proto); (); } else { result = new DecodeableRpcResult(channel, res, new UnsafeByteArrayInputStream(readMessageData(is)), (Invocation) getRequestData(id), proto); } data = result; } ult(data); } else { ObjectInput in = alize((), is, proto); orMessage(F()); } } catch (Throwable t) { //如果不成功,直接设置错误状态,并将error信息返回 if (Enabled()) { ("Decode response failed: " + sage(), t); } tus(_ERROR); orMessage(ng(t)); } return res; } else { // decode request.

如果是请求信息 Request req = new Request(id); sion(tocolVersion()); //tocolVersion() == Dubbo RPC protocol version == 2.0.2 Way((flag & FLAG_TWOWAY) != 0); if ((flag & FLAG_EVENT) != 0) { nt(true); } try { Object data; if (t()) { ObjectInput in = alize((), is, proto); data = decodeEventData(channel, in); } else { DecodeableRpcInvocation inv; if (().getParameter(DECODE_IN_IO_THREAD_KEY, DEFAULT_DECODE_IN_IO_THREAD)) { inv = new DecodeableRpcInvocation(channel, req, is, proto); (); } else { inv = new DecodeableRpcInvocation(channel, req, new UnsafeByteArrayInputStream(readMessageData(is)), proto); }

data = inv; } a(data); } catch (Throwable t) { if (Enabled()) { ("Decode request failed: " + sage(), t); } // bad request ken(true); a(t); } return req; } }


本文标签: 响应 状态 信息 编码 看到

更多相关文章

解锁CentOS奥秘:官方网站上的系统镜像生成全攻略

1月前

很多新手小白鼠想学习CentOS系统,不知道去哪里下载,随便去个第三方发现要么要注册,要么各种广告病毒,或好不容易找到官网,进去一看却一脸懵,不仅全英文,有些专业术语也不懂。下面我就带大家一起来学习一下如何在centos官网下载系统镜

从菜鸟到高手:只需三步,全面解析电脑硬件信息

1月前

怎么查看电脑配置呢?很多朋友想要了解自己电脑详细的配置的时候,一般都是通过第三方的工具检测的,那么有没有其他更好的方法呢?下面带你认识下查看电脑配置的三种方法。以下方法针对win7、win8、win10系统有效果

探索与挑战:利用windbg_minidump解决Adobe Flash Player中的SWF问题

1月前

dump文件,在VC中的调试还是非常非常非常有用的,因为我们也不会经每一行代码都加上日志,当然如果你愿意,也可以每一行都加上日志; 在Windows上,添加dump文件方法:方法一:一个是在程序中添加代码;

学习EXE反汇编艺术:通过objdump一窥全貌

1月前

概述:上次用java生成exe文件。那如何解析exe文件呢?0.0 首先我们要了解exe文件里面有什么。用360压缩解压一下。 .data: 存储程序中的初始化的全局和静态变量。在程序

透视EXE的内部构造:借助objdump反汇编工具揭秘

1月前

概述:上次用java生成exe文件。那如何解析exe文件呢?0.0 首先我们要了解exe文件里面有什么。用360压缩解压一下。 .data: 存储程序中的初始化的全局和静态变量。在程序

秘密武器"大公开:快速识别笔记本主板型号不求人指南!

1月前

轻松掌握:如何快速查看笔记本电脑主板型号在笔记本电脑的日常使用和维护中,了解主板型号是一项至关重要的技能。主板作为电脑的“骨架”,承载着处理器、内存、硬盘等核心硬件,其型号不仅关乎电脑的性能表现,还直接影响到硬件升级、故

The Comprehensive Step-by-Step Guide for Activating Dell 2008 Server & Vista via OEM Key

1月前

VISTASERVER 2008 OEM激活要分两个部分:软件方面和硬件方面 一、软系统方面系统要求,目前知道的WINDOWS 6系统中,比较常用的VISTAHome Basic、Home Premium

Word新手必学:一键搞定插入页眉与清除横杠小教程,让你文稿整洁美观。

1月前

当我们给Word添加完页眉的时候,会发现,被添加的页眉下面有一条横线,怎么也删除不掉,这时候应该怎么办呢? Word中的插入页眉方法 方法1: 打开Word文档,将鼠标放在Word顶部,双击鼠标,就可以进入页眉

电脑小白也能懂!从设备管理器开始,解读你的显卡标识

1月前

电脑显卡是决定图形性能的关键硬件之一,对于电脑的图形处理和游戏性能有着重要的影响。了解自己电脑的显卡型号和性能可以帮助用户更好地了解自己电脑的性能状况,以及是否需要升级显卡以提升性能。本文将介绍怎么看电脑显卡的三种方法,帮助用户快速了

ASF文件格式与HTTP:Flash中心如何编织它们之间的网络连接

23天前

asf 是 ( advanced streaming format 高级串流格式)的缩写,是 microsoft 为 windows 98 所开发的串流 文件格式。这个词汇当前可和 wma 及 wmv 互换使用

魔兽世界API接口:探索游戏背后的魔法技术

22天前

第14章 如何运用魔兽世界API接口 13.1 理解魔兽世界API 在UE5.2的游戏开发中,我们可以借鉴魔兽世界API的设计理念来创建强大且灵活的交互系统。魔兽世界拥有一套成熟的API架构,允许开发者和插件创作者访问

H3C路由器配置详解:轻松打造专业网络环境

22天前

需要软件工具 拓扑 H3C Comware的视图模式 1.用户视图:查看系统的硬件和系统的信息 和统计信息 2.系统视图(类似于Cisco的配置模式)

理解WMI Provider Host和WmiPrvSE.exe:当CPU资源争夺战时,如何取胜?_kvipgui.exe是什么秘密武器?

21天前

WmiPrvSE.exe是什么进程?WMI Provider Host占用很高CPU怎么办? 时间:2018-01-06 来源:系统之家 作者:chunhuaWmiPrvSE.exe是什么进程?WMI Provid

OneNote与Adobe Flash Player:协同提升生产力的双剑合璧

21天前

Office OneNote 2007 是一个数字笔记本,为人们提供一个用于收集他们的笔记与信息的位置、快速查找他们寻找内容的强大搜索功能和易用共享笔记本,以便他们可以管理信息负载并高效地协同工作。与纸张式系统、字处理程序、电子

Office OneNote 2007:跨越文本与视觉的笔记革命

21天前

Office OneNote 2007 是一个数字笔记本,为人们提供一个用于收集他们的笔记与信息的位置、快速查找他们寻找内容的强大搜索功能和易用共享笔记本,以便他们可以管理信息负载并高效地协同工作。 与纸张式系统、字处理程序、电

告别混乱:用这个方法快速将搜狗收藏夹同步到IE、Firefox、Chrome

20天前

[color=darkred] 搜狗的浏览器比较恶心,收藏夹导出是xml格式的,不能直接导入到IE或者Chrome中~~而最近又狂fan谷歌的浏览器,浏览速度实在是太快了~~界面又非常简洁~~唯一的不足是在我机子上老崩溃掉。。。

AVR PC软盘驱动模拟不再受限制,fddEMU助你一臂之力

19天前

fddEMU:AVR基的PC软盘驱动器模拟器 项目介绍 fddEMU是一个基于AVR(具体使用Atmega328P)的DIY软盘驱动器模拟器,旨在让复古电脑爱好者能够在现代或老式计算机上无需实体软盘即可访问多样的磁盘镜

佳能相机的.CR2格式:从基础到进阶的解读教程

19天前

CR2 (Canon Raw 2)文件是佳能数码相机所使用的一种原始图像(RAW)文件格式。它是一些流行的佳能数码相机使用的文件类型,如 EOS400D、EOS450D 等。 佳能 CR2 文件以 cr2 结尾,而 JPG 图

win11如何查看电脑硬件信息 win11系统怎么查看电脑配置_win11查看电脑配置

10天前

在使用电脑的过程中,了解自己电脑的硬件信息是非常有必要的,可以帮助我们更好地了解电脑的性能和配置,进而为系统升级和软件安装提供更加有针对性的建议。Win11为用户提供了多种方式来查看电脑硬件信息,刚升级win11的用户,可能对操作

iPhone连接电脑失败?检查这3个关键点!

8天前

你有没有遇到过苹果设备连接电脑后无法识别的情况?有时我们需要将iPhone端数据导入电脑,使用USB数据线连接手机和电脑后,却在电脑端无法找到识别的设备。 甚至打开其它软件也无法识别到已连接的设备,

发表评论

全部评论 0
暂无评论