显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

汉斯的博客

信之:疯子和天才只一步之差,奋起直追,提升自我,坚持不懈,永不言弃!

 
 
 
 
 
 

分析Netty工作流程

2014-4-13 19:41:28 阅读18 评论0 132014/04 Apr13

下面以Netty中Echo的例子进行流程跟踪,并简要的

服务器启动->客户端连接-> 服务器处理连接-> 服务器处理客户端数据<-> 客户端处理服务器数据

1:客户端连接:

我们直接看这行代码:

bootstrap.connect(new InetSocketAddress(host, port));

通过帮助类ClientBootstrap来连接服务器。

Debug源码进去发现最后是某个Channel类进行connect操作。

而这个Channel是如何来的呢?其实是从前面的 ChannelFactory和ChannelPipelineFactory得到的。

Channel.connect-> AbstractChannel.connect->Channels.connect(…);

Channels是Channel的帮助类,封装一些常用的操作。在封装操作时,基本都是触发事件。

这里发起一个connectd的Downstream的事件。

所有的事件都是丢给ChannelPipeline进行管理,ChannelPipeline使用了责任链模式来将事件传送给注册到Pipeline中的ChannelHandler,由ChannelHandler进行处理。如果遍历了所有的ChannelHandler后则交给ChannelSink进行处理,ChannelSink根据不同的事件进行不同的处理,

作者  | 2014-4-13 19:41:28 | 阅读(18) |评论(0) | 阅读全文>>

基于Websocket草案10协议的升级及基于Netty的握手实现

2014-4-13 12:12:02 阅读14 评论0 132014/04 Apr13

最近发现,WEBWW在chrome14及FF6.5中没法与后台建立连接了,后面经过查找原因,是chrome14中使用最新的websocket协议草案,而chrome12中使用的websocket协议标准还是草案7.5、7.6的标准;现在草案的最新版本是草案10,草案的链接地址为:http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10,本次协议变更比较大,主要体现在安全性和可扩展性上:

1、握手的标准:

1)、最老的websocket草案标准中是没有安全key,草案7.5、7.6中有两个安全key,而现在的草案10中只有一个安全key,即将7.5、7.6中http头中的"Sec-WebSocket-Key1"与"Sec-WebSocket-Key2"合并为了一个"Sec-WebSocket-Key"

2)、把http头中Upgrade的值由"WebSocket"修改为了"websocket";

3)、把http头中的"-Origin"修改为了"Sec-WebSocket-Origin";

4)、增加了http头"Sec-WebSocket-Accept",用来返回原来草案7.5、7.6服务器返回给客户端的握手验证,原来是以内容的形式返回,现在是放到了http头中;另外服务器返回客户端的验证方式也变了,后面会有介绍。

作者  | 2014-4-13 12:12:02 | 阅读(14) |评论(0) | 阅读全文>>

基于netty的websocket开发小结

2014-4-13 12:08:41 阅读29 评论0 132014/04 Apr13

WebSocket是html5规范新引入的功能,用于解决浏览器与后台服务器双向通讯的问题,使用WebSocket技术,后台可以随时向前端推送消息,以保证前后台状态统一,在传统的无状态HTTP协议中,这是“无法做到”的。

WebSocket提出之前,为了解决后台推送消息到前台的需求,提出了一些解决方案,这些方案使用已有的技术(如ajax,iframe,flashplayer,java applet ...),通过一些变通的处理来实现。

webSocket是html5新引入的技术,允许后台随时向前端发送文本或者二进制消息,WebSocket是一种全新的协议,不属于http无状态协议,协议名为"ws",这意味着一个websocket连接地址会是这样的写法: 

ws://127.0.0.1:8080/websocket。ws不是http,所以传统的web服务器不一定支持,需要服务器与浏览器同时支持, WebSocket才能正常运行,目前的支持还不普遍,需要特别的web服务器和现代的浏览器。

浏览器对WebSocket的支持 

Google Chrome浏览器最先支持WebSocket,随后是Safari,Firefox,此外最新版本的Opera和IE(Opera11,IE10)也支持WebSocket。

客户端WebSocket的主要方法

1 构造函数

Java代码

var websocket = new WebSocket("ws://127.0.0.1:8080/websocket");

作者  | 2014-4-13 12:08:41 | 阅读(29) |评论(0) | 阅读全文>>

java开源高性能nio框架netty

2014-4-12 16:51:53 阅读19 评论0 122014/04 Apr12

1、netty是什么?

2、netty能解决什么问题?

3、如何使用netty?

4、编写后,如果做监控、安全等的扩展

5、应用在java程序中进行交互。

作者  | 2014-4-12 16:51:53 | 阅读(19) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 4

2014-4-11 21:56:30 阅读14 评论0 112014/04 Apr11

半关闭socket

TCP和SCTP允许用户关闭一个socket的出站流量而不用完全关闭它。这样的socket被称为“半关闭socket”,同时用户能够通过调用SocketChannel.shutdownOutput()方法来获取一个半关闭socket。如果一个远端关闭了出站通道,SocketChannel.read(..)会返回-1,这看上去并没有和一个关闭了的链接有什么区别。

3.x没有shutdownOutput()操作。同样,它总是在SocketChannel.read(..)返回-1的时候关闭链接。

要支持半关闭socket,4.0增加了SocketChannel.shutdownOutput()方法,同时用户能设置“ALLOW_HALF_CLOSURE”的ChanneOption来阻止Netty在SocketChannel.read(..)返回-1的时候自动关闭链接。

灵活的I/O线程分配

在3.x里,一个Channel是由ChannelFactory创建的,同时新创建的Channel会自动注册到一个隐藏的I/O线程。4.0使用新的名为EventLoopGroup的接口来替换ChannelFactory,它由一个或多个EventLoop来构成。同样,一个新的Channel不会自动注册到EventLoopGroup,但用户可以显式调用EventLoopGroup.register()来注册。

感谢这个变化(举例来说,分离了ChannelFactory和I/O线程),用户可以注册不同的C

作者  | 2014-4-11 21:56:30 | 阅读(14) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 6

2014-4-11 21:55:51 阅读13 评论0 112014/04 Apr11

良好定义的线程模型

在3.x里并没有良好设计的线程模型,尽管曾经要修复线程模型在3.5的不一致性。4.0定义的一个严格的线程模型来帮助用户编写ChannelHandler而不必担心太多关于线程安全的东西。

Netty将不会再同步地调用ChannelHandler的方法了,除非ChannelHandler由@Shareable注解。这不会理会处理器方法的类似——入站、操作、或者是生命周期时间处理器方法。用户不再需要同步入站或出站的事件处理器方法。4.0不允许加入加入一个ChannelHandler超过一次,除非它由@Sharable注解。每个由Netty调用的ChannelHandler的方法之间的关系总是happens-before。用户不用定义一个volatile字段来保存处理器的状态。用户能够在他加入一个处理器到ChannelPipeline的时候指定EventExecutor。如果有指定,ChannelHandler的处理器方法总是由自动的EventExecutor来调用如果没指定,处理器方法总是由它关联的Channel注册到的EventLoop来调用。声明到一个处理器的EventExecutor和EventLoop总是单线程的。处理器方法总是由相同线程调用。如果指定了多线程的EventE

作者  | 2014-4-11 21:55:51 | 阅读(13) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 5

2014-4-11 21:54:45 阅读15 评论0 112014/04 Apr11

简化的关闭

releaseExternalResources()不必再用了。你可以通过调用EventLoopGroup.shutdown()直接地关闭所有打开的连接同时使所有I/O线程停止,就像你使用java.util.concurrent.ExecutorService.shutdown()关闭你的线程池一样。

类型安全的ChannelOptions

有两个方法来配置Netty的Channel的socket参数。第一个是明确地调用ChannelConfig的setter,例如SocketChannelConfig.setTcpNoDelay(true)。这是最为类型安全的方法。另外一个是调用ChannelConfig.setOption()方法。有时候你不得不决定在运行时的时候socket要配置什么选项,同时这个方法在这种情况下有点不切实际。然而,在3.x里它是容易出错的,因为一个用户必需用一对字符串和对象来指定选项。如果用户调用了错误的选项名或者值,他或她将会赵宇到一个ClassCastException或指定的选项甚至可能会默默地忽略了。

4.0引入了名为ChannelOption的新的类型,它提供了类型安全地访问socket选项。

01ChannelConfig cfg = ...;

02

03// Before:

04cfg.setOption("tcpNoDelay", true);

05cfg.setOption("tcpNoDe

作者  | 2014-4-11 21:54:45 | 阅读(15) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 3

2014-4-11 21:52:24 阅读12 评论0 112014/04 Apr11

每个处理器的缓存

不像3.x那样在每次读操作都简历一个新堆里的缓存来触发上游的MessageEvent,4.0不会每次都创建新的 缓存。它直接从socket中读取数据到由用户的ChannelInboundByteHandler和ChannelInboundMessageHandler实现创建的入站缓存。

因为由上述处理器创建的入站缓存直到关联的通道关闭前都会重用,所以在上面的GC和内存带宽消耗都能保持较小。同样,当接收到的数据被销毁时用户已经完成操作,codec的实现就变得更简单和有效了。

在创建出站缓存时也是差不多的(不会新建)。用户的ChannelOutBoundBYteHandler和ChannelOutboundMessageHandler来操作。

不需要每条消息都有一个事件

4.0里不再有了messageReceived或writeRequested处理器方法。它们被inboundBufferUpdated和flush代替了。用户的入队一个或多个消息到一个入站(或出站)缓存同时会出发一个inboundBUfferUpdated(或flush)事件。

01public void inboundBufferUpdated(ChannelHandlerContext ctx) {

02    Queue<MyMessage> in = ctx.inboundMessageBuffer();

0

作者  | 2014-4-11 21:52:24 | 阅读(12) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 2

2014-4-11 21:51:29 阅读11 评论0 112014/04 Apr11

Channel API的变化

在4.0中,许多io.netty.channel包中的类都经历大量修改,因此文本上的简单搜索-替换是无法让你基于3.x的程序迁移到4.0上。这个部分会尝试将这些重大变更背后的思考过程展示出来,而不只是简单地作为展示所有变更。

翻新后的ChannelHandler接口Upstream → Inbound, Downstream → Outbound

对于初学者来说,术语'upstream'(译者注:直译为向上游,有点像TCP/IP协议栈中从下往上,从物理层最终到达应用层这么一个流程)和'downstream'有点让人迷惑。在4.0中,只要可能,都会使用'inbound'(译者注:直译为开往内地的,相对于upstream确实更贴切,即指数据从外部网络经历层层filter到达我们的处理逻辑)和'outbound'来替换他们。

新的ChannelHandler继承层次

在3.x时代,ChannelHandler只是一个标记接口,而在ChannelUpstreamHandler、ChannelDownstreamHandler、LifeCycleAwareChannelHandler定义了具体的处理器方法。在Netty 4中,ChannelHandler将LifeCycleAwareChannelHandler接口和一堆实现辅助方法融合到了一起,具体见代码:

01public interface ChannelHandler {

02

作者  | 2014-4-11 21:51:29 | 阅读(11) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 1

2014-4-11 21:48:27 阅读12 评论0 112014/04 Apr11

英文原文:Netty4.0 New and noteworthy

翻译来自oschina.net 开源中国,5.0新特性在后面会给出。

这篇文章和你一起过下Netty的主发行版本的一些显著的改变和新特性,让你在把你的应用程序转换到新版本的时候有个概念。

项目结构改变

Netty的包名从org.jboss.netty改为io.netty,因为我们不在是JBoss.org的一部分了

二进制JAR包被分为了多个子模块以便用户能够从类路径中去掉非必需的特性。当前的结构如下:

模块描述nettyproject parentcommonutility and loggingbufferbuffer APItransportchannel API and its core implementationstransport-rtrxRTRX transport implementation

作者  | 2014-4-11 21:48:27 | 阅读(12) |评论(0) | 阅读全文>>

WebSocket与Java

2014-4-10 22:56:35 阅读17 评论0 102014/04 Apr10

 转自infoq 作者 张龙 发布于 2013年12月22日

Bozhidar Bozhanov是Ontotext AD的高级软件工程师,拥有多年的从业经验,也是stackoverflow上的活跃用户。他精通于Java与Java技术栈,如Spring、JPA、JavaEE等,同时还是http://computoser.comhttp://welshare.com的创始人。曾开发过爱立信的项目、保加利亚电子政务项目以及大型招聘平台等。近日Bozhidar撰文谈到了WebSocket与Java,并给出了相应的代码示例。Bozhidar在文中详细分析了WebSocket的原理、适用范围,以及如何通过Java来使用WebSocket。

WebSocket是一个很酷的新技术,可以实现浏览器与服务器之间实时、双向的通信,几乎没有任何额外的代价。我这里要做的事情就是提供一个非常简洁,但却内容丰富的概览,介绍如何开始使用这门技术。首先读者需要了解如下一些事情:

首先在浏览器与服务器之间需要开启一个TCP Socket连接,每一方都可以向对方发送消息(比如说,服务器可以在有数据时将其推送出去,无需使用轮询、长轮询、iframes等技术)。并不是所有浏览器都支持WebSocket技术,IE 10是首个支持WebSocket的IE版本,Android依然还存在着一些问题。幸好有SockJS,在不支持WebSocke

作者  | 2014-4-10 22:56:35 | 阅读(17) |评论(0) | 阅读全文>>

应对Memcached缓存失效,导致高并发查询DB的四种思路

2014-4-10 10:40:12 阅读20 评论0 102014/04 Apr10

 转自一位同事的文章:

当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升。

这篇blog主要是探讨如何在缓存将要失效时,及时地更新缓存,而不是如何在缓存失效之后,如何防止高并发的DB查询。

解决这个问题有四种思路:

比如一个key是aaa,失效时间是30s。

1.定期从DB里查询数据,再刷到memcached里

这种方法有个缺点是,有些业务的key可能是变化的,不确定的。

而且不好界定哪些数据是应该查询出来放到缓存中的,难以区分冷热数据。

2.当缓存取到为null时,加锁去查询DB,只允许一个线程去查询DB

这种方式不太靠谱,不多讨论。而且如果是多个web服务器的话,还是有可能有并发的操作。

3.在向memcached写入value时,同时写入当前机器在时间作为过期时间

当get得到数据时,如果当前时间 - 过期时间 > 5s,则后台启动一个任务去查询DB,更新缓存。

当然,这里的后台任务必须保证同一个key,只有一个线程在执行查询DB的任务,不然这个还是高并发查询DB。

缺点是要把过期时间和value合在一起序列化,取出数据后,还要反序列化。很不方便。

网上大部分文章提到的都是前面两种方式,有少数文章提到第3种方式。下面提出一种基于两个key的方法:

4.两个key,一个key用来存放数据,另一个用来标记失效时间

作者  | 2014-4-10 10:40:12 | 阅读(20) |评论(0) | 阅读全文>>

高效开发 Android App 的 10 个建议

2014-4-4 22:08:18 阅读18 评论0 42014/04 Apr4

假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比、耗电、耗内存。接下来就会得到用户的消极评论,最后名声也就臭了。即使你的应用设计精良、创意无限也没用。

耗电或者内存占用等影响产品效率的每一个问题都会影响App的成功。这就是为什么在开发中确保最优化、运行流畅而且不会使Android系统出问题 是至关重要的了。这里不需要讨论高效编程,因为我们不会关心你写的代码是否能够经得起测试。即使高效的代码也是需要时间来运行。今天这篇文章我们就讲讲怎 么尽可能地缩短运行时间,以及如何开发用户喜欢的App

高效地利用线程建议一:怎么在后台取消一些线程中的动作

我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受到影响。会导致程序陷入卡顿、死掉甚至会发生系统错误。

为了加快响应速度,需要把费时的操作(比如网络请求、数据库操作或者复杂的计算)从主线程移动到一个单独的线程中。最高效的方式就是在类这一级完成 这项操作,可以使用AsyncTask或者IntentService来创建后台操作。如果选择使用IntentService,它会在需要的时候启动起 来,然后通过一个工作线程来处理请求(Intent)。

作者  | 2014-4-4 22:08:18 | 阅读(18) |评论(0) | 阅读全文>>

今天上的话题是“不准哭”!

当孩子在我们面前哭的时候,我们要想一想孩子为什么会哭。真正爱孩子的家长,就应该设身处地去理解孩子,而不能以自己一厢情愿的理解,简单粗暴地对待他们。 

下面是书上给的例子:

“砰”,一只花瓶碎了,爷爷抬头一看,孙女李静被吓傻了一样呆站在那里,脚边是散了一地的花瓶碎片。“你这孩子,三天两头给我捣蛋,是想要我的命呀!”“爷爷,不是我弄碎的,是猫!”孩子说这话的时候,猫已经跑远了,它好像知道自己犯了错躲起来了。“错了就错了,还要怪猫,猫都没有在这里。它怎么弄的?”“呜呜......真的不是我。”觉得很受委屈的李静哇哇地哭了。“不准哭!你还委屈了,你?”爷爷不说还好,这一说倒让小家伙更委屈了,哭个不停。

哭,其实是孩子发泄情绪的一种方式,如果孩子心里有委屈、难受或者伤心的事,一直憋着不释放出来,是一件非常痛苦的事,如果总是这样,会损害身体健康。曾读过一篇文章,说哭是一种情绪治疗的有效方法,适度流泪对身体康复也是有帮助的。

孩子之所以哭,是因为爷爷错怪了她,她觉得委屈,所以就哭了出来。而爷爷说“不准哭”实际上等于告诉孩子:你做错了事还哭,简直是无理取闹,我根本就没有冤枉你。

透过这句话,至少我们会得出这样一个结论,爷爷对孙女还不能够充分的信任!这是一个非常危险的信号,在家庭中,如果有人对家庭成员存在着某种不信任,那他们的关系将很难保持愉快。一起生活,发生摩擦是很正常的事情,但如果不能彼此信任将会恶化感情。

家长应该对孩子有足够的信任,这样孩子才能感觉到自己

作者  | 2014-4-2 15:50:25 | 阅读(17) |评论(0) | 阅读全文>>

今天,我把话题直接放在标题上,更醒目一点,这样日志也可以被有选择性的阅读。

喜欢循规蹈矩的大人们,应该意识到,虽然按着条框走路不会犯大错误,但是也难于成就大事业,它往往触缚着一个人的个性发展,只有不墨守成规和有主见的人,才容易取得令人瞩目的成就。阻碍和影响一个人发展,是一个很严重的问题,顺其自然,让其创新,人各有体,能够形成自己的风格很重要!

书上有这样的例子:

“爸爸回来了!”李杰的爸爸刚进家门就高兴地喊儿子。每次他这样喊,儿子小杰就会跑出来嚷着要他抱抱、亲亲。李爸爸很享受这种天伦之乐。

“爸爸回来了,小杰在哪里呢?”喊了两声也不见小家伙跑出来,爸爸觉得很奇怪。走进房间才发现儿子正专注地玩昨天晚上给他买的新玩具呢。虽然小家伙看不懂说明书,但他却在那里玩的很专注,很开心。爸爸:“儿子,你这个玩法不对,这个玩具应该这样玩。”于是,爸爸把玩具拿了过来,按照说明一步一步地展示给孩子看!爸爸本意是想教给儿子正确的玩法,但是孩子却不领情,从爸爸手里夺回了玩具,不满意地嚷嚷道:“不,就是这样玩。”爸爸:“不对,应该这样玩。”......

在大人眼中,多的是成规,在他们看来,遵循既有的规矩办事更少犯错误,更容易达到目标;而在孩子的眼中,条框和规矩还没有形成,或者说还没有那么成规与定势,所以,孩子们是“勇于尝鲜的英雄”,也正因为这个原因,我们有了“曹冲称象”的故事:曹冲没有墨守成规,而是换了一个新方法,轻而易举地称出了大象的重量。也正是因为有了像曹冲这样大胆的想象与尝试,人类才有了今天的文明--只因为人类有了想上天的梦想,我

作者  | 2014-4-1 13:46:59 | 阅读(22) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 

广东省 深圳市 处女座

 发消息  写留言

 
对互联网系统与应用架构、中间件架构、大型分布式系统架构、系统性能优化(特别是互联网性能优化)等有深入研究。
 
近期心愿让麦客彩基本可用、出去自驾旅游2-3次(已经完成2次)
POPO  daihaixiang@163.com
QQ54339729
MSNcnhaixiang@hotmail.com
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

天气

 
 
模块内容加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
圈子列表加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2014

创建博客 登录  
 加关注