- 浏览: 787492 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
Netty源码学习-FileRegion -
飞天奔月:
写得有趣 ^_^
那一年你定义了一个接口 -
GoldRoger:
第二个方法很好
java-判断一个自然数是否是某个数的平方。当然不能使用开方运算 -
bylijinnan:
<script>alert("close ...
自己动手实现Java Validation -
paul920531:
39行有个bug:"int j=new Random ...
java-蓄水池抽样-要求从N个元素中随机的抽取k个元素,其中N无法确定
本文是阅读以下两篇文章时:
http://seeallhearall.blogspot.com/2012/05/netty-tutorial-part-1-introduction-to.html
http://seeallhearall.blogspot.com/2012/06/netty-tutorial-part-15-on-channel.html
我的一些笔记
=================笔记1
static class ServerDateHandler extends SimpleChannelHandler { Random random = new Random(System.nanoTime()); public void messageReceived(ChannelHandlerContext ctx,MessageEvent e) throws Exception { Date date = (Date)e.getMessage(); // Here's the REALLY important business service at the end of the pipeline long newTime = (date.getTime() + random.nextInt()); Date newDate = new Date(newTime); slog("Hey Guys ! I got a date ! [" + date + "] and I modified it to [" + newDate + "]"); // Send back the reponse Channel channel = e.getChannel(); ChannelFuture channelFuture = Channels.future(e.getChannel()); ChannelEvent responseEvent = new DownstreamMessageEvent(channel, channelFuture, newDate, channel.getRemoteAddress()); ctx.sendDownstream(responseEvent); // But still send it upstream because there might be another handler super.messageReceived(ctx, e); } }
为什么不直接这样:ctx.getChannel().write(newDate)?
作者是这样解释的:
If we wrote to the Channel directly, it would start from the "top" of the pipeline and might be pushed through handlers that are not indented to be called with the return Date.
不是很理解,看看源码:
e.getChannel().write最终调用DefaultChannelPipeline,从最后一个ChannelHandler(tail)往前,
消息会经过所有的DownstreamHandler:
public void sendDownstream(ChannelEvent e) { DefaultChannelHandlerContext tail = getActualDownstreamContext(this.tail); if (tail == null) { try { getSink().eventSunk(this, e); return; } catch (Throwable t) { notifyHandlerException(e, t); return; } } sendDownstream(tail, e); }
ctx.sendDownstream则只从当前的ChannelHandler往前走,也就是,
只有在当前ChannelHandler之前的ChannelHandler,才会经过:
public void sendDownstream(ChannelEvent e) { DefaultChannelHandlerContext prev = getActualDownstreamContext(this.prev); if (prev == null) { try { getSink().eventSunk(DefaultChannelPipeline.this, e); } catch (Throwable t) { notifyHandlerException(e, t); } } else { DefaultChannelPipeline.this.sendDownstream(prev, e); } }
这样可以避免消息穿过不必要的ChannelHandler,当然,如果清楚地知道,
那些“不必要的ChannelHandler”不会修改消息,
那直接e.getChannel().write也未尝不可
=================笔记2
a Channel provides the interface to connect and write to the destination represented by the Channel. No read ? you might ask ? Nope. Remember, it's like the asynchronous getWidgetCountmethod mentioned above. There's no return value.
Channel没有read方法?那怎么读取消息?
原来,读取到的消息,都封装在MessageEvent里面了,
它帮你读取好了,再fireMessageReceived通知你处理——这就是所谓的“异步”。详见NioWorker的read
=================笔记3
In the server, there is one boss thread allocated per listening socket. For example, if you opened two server ports such as 80 and 443, you will have two boss threads. In the client, there is only one boss thread*
=================笔记4
Please note that this decoder must be used with a proper FrameDecoder such as DelimiterBasedFrameDecoder if you are using a stream-based transport such as TCP/IP. // Decoders pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(80, Delimiters.lineDelimiter())); pipeline.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8));
为什么 StringDecoder要和FrameDecoder在一起使用?
因为任何消息的到来,刚开始都是byte[],如何进行“分段”( segment the byte stream,
分段方案有很多,例如length+content、或者delimiter等等),是第一个ChannelHandler的工作。
StringDecoder并没有“分段”的功能,它没有extends FrameDecoder
因此要在它前面安排一个FrameDecoder
=================笔记5
自定义delimiter:
ChannelBuffer delimiter = ChannelBuffers.wrappedBuffer("THEBIG-D".getBytes())
=================笔记6
In the server, there is one boss thread allocated per listening socket. In the client, there is only one boss thread* 1.The boss thread can be released when there is no work to do and is created lazily, but it may be more efficient to pool a small number of threads than create a new one when required and destroying it when idle. 2.It is possible that one might want to create several different channel factories and rather than giving each one their own boss pool, they can all share one.
为什么client只需要一个boss thread但仍然采用Excutor?
除了作者说的两个原因之外,我认为还有个原因是出于扩展性的考虑,允许你传入不同的Executor
=================笔记7
The Worker Threads: Worker threads perform all the asynchronous I/O. They are not general purpose threads and developers should take precautions not to assign unrelated tasks to threads in this pool which may cause the threads to block, be rendered unable to perform their real work which in turn may cause deadlocks and an untold number of performance issues.
第一次看这段话不理解,现在看来作者的意思应该是:worker thread是专门为IO而生,且是异步的。开发者不应该把其他工作交给worker thread运行
=================笔记8
Once you're done with a ChannelFactory, be sure to callreleaseExternalResources() on the factory. This will ensure that all its resources are released.
要记得调用 ChannelFactory的releaseExternalResources来释放资源:
bootstrap.releaseExternalResources(); public class Bootstrap...{ public void releaseExternalResources() { ChannelFactory factory = this.factory; if (factory != null) { factory.releaseExternalResources(); } } }
发表评论
-
TCP的TIME-WAIT
2014-04-23 16:35 1199原文连接:http://vincent.bernat.im/e ... -
《TCPIP详解卷1》学习-拥塞避免
2014-01-15 15:16 159拥塞避免算法、 ... -
Netty源码学习-HTTP-tunnel
2014-01-14 18:19 4305Netty关于HTTP tunnel的说明: http://d ... -
Netty源码学习-FileRegion
2013-12-31 17:17 5663今天看org.jboss.netty.example.http ... -
Netty源码学习-HttpChunkAggregator-HttpRequestEncoder-HttpResponseDecoder
2013-12-27 16:10 4092今天看Netty如何实现一个Http Server org.j ... -
Netty源码学习-ReadTimeoutHandler
2013-12-26 17:53 3844ReadTimeoutHandler的实现思 ... -
Netty源码学习-ChannelHandler
2013-12-25 18:12 1637一般来说,“有状态”的ChannelHandler不应 ... -
Netty源码学习-ServerBootstrap启动及事件处理过程
2013-12-19 20:11 10765Netty是采用了Reactor模式的多线程版本,建议先看下面 ... -
Netty源码学习-Java-NIO-Reactor
2013-12-19 18:21 4896Netty里面采用了NIO-based Reactor Pat ... -
Netty源码学习-ReplayingDecoder
2013-12-13 20:21 4267ReplayingDecoder是FrameDecoder的子 ... -
Netty源码学习-DefaultChannelPipeline2
2013-12-11 15:47 1286Netty3的API http://docs.jboss.or ... -
Netty源码学习-CompositeChannelBuffer
2013-12-06 15:54 2763CompositeChannelBuffer体现了Netty的 ... -
Netty源码学习-DelimiterBasedFrameDecoder
2013-12-05 18:36 9563看DelimiterBasedFrameDecoder的AP ... -
Netty源码学习-ObjectEncoder和ObjectDecoder
2013-12-05 16:06 5008Netty中传递对象的思路很直观: Netty中数据的传递是基 ... -
Netty源码学习-LengthFieldBasedFrameDecoder
2013-12-05 15:20 7313先看看LengthFieldBasedFrameDecoder ... -
Netty源码学习-FrameDecoder
2013-11-28 18:38 3940Netty 3.x的user guide里FrameDecod ... -
Netty源码学习-DefaultChannelPipeline
2013-11-27 17:00 2243package com.ljn.channel; /** ...
相关推荐
### Netty学习笔记知识点概述 #### 一、Netty简介 Netty是一个广泛使用的高性能、异步事件驱动的网络应用程序框架,它简化了网络编程的复杂性,使得开发者能够更轻松地开发高性能、高可靠性的网络服务器和客户端。...
Netty学习笔记_Springboot实现自定义协议 本文主要介绍了使用Netty框架在Springboot项目中实现自定义协议的方法。自定义协议是指在网络通信中,使用特定的数据格式来传输数据,以满足特定的业务需求。在本文中,...
Netty基础,用于学习Netty,参考黑马程序员的netty教程
二、Netty 学习笔记 学习笔记通常包含了作者在学习过程中的总结和实践经验,对于初学者来说极具参考价值。笔记可能涵盖 Netty 的安装配置、基本使用、线程模型、缓冲区操作、编解码器的实现以及异常处理等方面,帮助...
在本篇Netty4.0学习笔记中,我们将聚焦于如何在实际应用中混合使用`coder`和`handler`,这是Netty框架中非常关键的一部分,对于构建高性能、低延迟的网络应用程序至关重要。Netty是一个用Java编写的异步事件驱动的...
在Netty网络框架学习笔记-1中,可能详细介绍了NIO的基本概念,如选择器(Selector)、通道(Channel)和缓冲区(Buffer),以及它们如何协同工作以提高并发处理能力。 2. **Netty入门**:笔记-3和-5探讨了Netty的入门知识...
这个“Netty学习资料.zip”压缩包包含了韩顺平老师关于 Netty 的一系列教学资源,包括资料、笔记、课件、代码和软件,这些都是深入理解和实践 Netty 技术的重要参考资料。 首先,资料部分可能包含了一些关于 Netty ...
这篇全面的学习笔记主要围绕 Netty 的运行环境、架构、网络模型(Reactor 模式)以及处理模型(Pipeline 模式)进行详细讲解。 1. **运行环境** 在学习 Netty 时,使用的版本是 Netty-3.2.5.Final,兼容 JDK 1.6。...
在本篇Netty4.0学习笔记系列之六中,我们将深入探讨Netty框架如何支持多种通讯协议,以及它在实现高效、灵活的网络通信中的关键特性。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的...
在本篇“Netty4.0学习笔记系列之五:自定义通讯协议”中,我们将深入探讨如何在Netty框架下构建和实现自己的通信协议。Netty是一个高性能、异步事件驱动的网络应用框架,广泛应用于Java领域的服务器开发,如网络游戏...
在本篇“Netty4.0学习笔记系列之二:Handler的执行顺序”中,我们将深入探讨Netty中的Handler处理链以及它们的执行流程。 首先,Netty 中的 ChannelHandler 是处理 I/O 事件或拦截 I/O 操作的核心组件。每个 ...
Netty4.0学习笔记系列之三是关于构建简单的HTTP服务的教程,这主要涉及网络编程、服务器开发以及Java NIO(非阻塞I/O)的相关知识。Netty是一个高性能、异步事件驱动的网络应用程序框架,它使得开发可伸缩且稳定的...
在本文中,我们将深入探讨Netty 4.0的学习笔记,特别是关于Server与Client之间的通信机制。 首先,我们要理解Netty的核心概念——NIO(非阻塞I/O)。Netty基于Java NIO库构建,它提供了更高级别的API,简化了多路...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Web开发中,Netty常被用来构建高效的服务端通信系统,尤其在处理大量并发连接时,其优势更为明显。 在文档...
读书笔记:netty 学习《Netty权威指南》第2版
这个“自动Netty笔记111”可能是某个开发者或学习者记录的一系列关于Netty学习过程中的关键点和理解。下面将详细阐述Netty的相关知识点。 1. **异步事件驱动模型**: Netty采用了非阻塞I/O模型,基于Java NIO(Non...
读书笔记:Netty学习与实战Demo