netty 5 与 4 区别.x与4.x区别大吗

1176人阅读
Netty5(1)
Netty5.x 和3.x、4.x的区别及注意事项
(官方翻译)
  本文档列出了Netty5新版本中值得注意变化和新特性列表。帮助你的应用更好的适应新的版本。
  不像Netty3.x和4.x之间的变化,5.x没有那么大的变化,不过也取得了其简化设计中的一些突破性进展.。我们力求尽可能平滑的从4.x版本过度到5.x版本,如果你在迁移过程中遇到任何问题,请告知我们。
支持Android
&移动设备变成更加强大通过Ice Cream Sandwich解决了在ADK中最著名的与NIO和SSLEngine相关的问题,且用户显然想要重用他们应用中的的编解码和处理器代码。
我们决定官方支持Android(4.0及以上版本)
简化处理器层次
  ChannelInboundHandler和ChannelOutboundHandler整合为ChannelHandler。ChannelHandler现在包含输入和输出的处理方法。
  ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter和ChannelDuplexHandlerAdapter已被废弃,由 ChannelHandlerAdapter代替。
  由于现在无法区分处理器(handler) 是输入还是输出的处理器,CombinedChannelDuplexHandler现在由 ChannelHandlerAppender代替。
更多相关变化,可参考
  channelRead0() → messageReceived()
  我知道。这是一个愚蠢的错误。如果你使用了SimpleChannelInboundHandler,你需要把channelRead0()重命名为messageReceived()。
废弃中移除的
  Channel.deregister()已被移除。不再生效和被使用。取而代之的,我们将允许Channel被充注册到不同的事件循环。
  ChannelHandlerContext.attr(..) == Channel.attr(..)
  Channel和ChannelHandlerContext类都实现了AttributeMap接口,使用户可以在其上关联一个或多个属性。有时会让用户感到困惑的是Channel和ChannelHandlerContext都有其自己的存储用户定义属性的容器。例如,即使你通过Channel.attr(KEY_X).set(valueX)给属性'KEY_X’赋值,你却无法通过ChannelHandlerContext.attr(KEY_X).get()方法获取到值。反之亦是如此。这种行为不仅仅令人不解而且还浪费内存。
  为了解决这个问题,我们决定每个Channel内部仅保留一个map。AttributeMap总是用AttributeKey作为它的key。AttributeKey确保键的唯一性,因此每个Channel中如果存在一个以上的属性容易是多余的。只要用户把他自己的AttributeKey定义成ChannelHandler的private static final变量,就不会有出现重复key的风险。
更简单更精确的缓冲区泄漏追踪
&  之前,查找缓冲区泄漏是很困难的,并且泄漏的警告信息也不是很有帮助。现在我们有了增强的泄漏报告机制,该机制会在增长超过上限时触发。
  更多的信息可查看:http://netty.io/wiki/reference-counted-objects.html 。由于该特性十分重要,所以也移植入了4..0.14.Final版中。
PooledByteBufAllocator成为默认的allocator
  在4.x版本中,UnpooledByteBufAllocator是默认的allocator,尽管其存在某些限制。现在PooledByteBufAllocator已经广泛使用一段时间,并且我们有了增强的缓冲区泄漏追踪机制,所以是时候让PooledByteBufAllocator成为默认了。
全局唯一的Channel ID
  每个Channel现在有了全局唯一的ID,其生成的依据是:
& &  ● MAC地址(EUI-48或是EUI-64),最好是全局唯一的,
● 当前进程的ID
& &  ● System#currentTimeMillis()
& &  ● System#nanoTime()
&   &● 随机的32位整数,以及
& &  ● 系列递增的32位整数
  可通过Channel.id()方法获取Channel的ID。
更灵活的线程模型
  增加了新的ChannelHandlerInvoker接口,用于使用户可以选择使用哪个线程调用事件处理方法。替代之前的在向ChannelPipeline添加 ChannelHandler时指定一个EventExecutor的方式,使用该特性需要指定一个用户自定义的 ChannelHandlerInvoker实现。
  关于该变化更多的信息,可参考:
EmbeddedChannel的易用性
  EmbeddedChannel中的readInbound()和readOutbound()方法返回专门类型的参数,因此你不必在转换他们的返回值。这可以简化你的测试用例代码。
EmbeddedChannel ch = ...;
// BEFORE:
FullHttpRequest req = (FullHttpRequest) ch.readInbound();
FullHttpRequest req = ch.readInbound();
使用Executor代替ThreadFactory
  有些应用要求用户使用Executor运行他们的任务。4.x版本要求用户在创建事件循环(event loop)时指定ThreadFacotry,现在不再是这样了。
  关于该变化的更多信息,可参考:/netty/netty/pull/1762
Class loader友好化
  一些类型,如AttributeKey对于在容器环境下运行的应用是不友好的,现在不是了。
编解码和处理器(handlers)
&    ● XmlFrameDecoder支持流式的XML文档
& &  &● 二进制的memcache协议编解码
&    ● 支持SPDY/3.1 (也移植到了4.x版本)
● 重构了HTTP多部分的编解码
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7180次
排名:千里之外
(4)(1)(3)(2)(1)(2)Netty(2)
提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients.
是一个基于NIO的客户-服务器端编程框架,使用Netty 可以确保你快速、简单的开发出一个网络应用,例如实现了某种协议的客户-服务端应用。Netty极大程度的简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.
Netty通信模型
Netty的特性
统一的API,适用于不同的协议(阻塞和非阻塞)
基于灵活、可扩展的事件驱动模型
高度可定制的线程模型
可靠的无连接数据Socket支持(UDP)
完善的JavaDoc,用户指南和示例代码
无额外依赖,仅仅依赖 JDK 5 (Netty 3.x) or JDK6 (Netty 4.x)
更好的吞吐量,低延迟
尽量减少不必要的内存拷贝
完整的SSL/TLS和STARTTLS支持
简单的hello world程序
了解了Netty的基本概念之后,通过一个简单的sample来了解如何使用Netty提供的API构建自己的应用程序。
1.开发环境
JDK 1.7 or higher
Eclipse Juno
2.添加Maven依赖
&io.netty&
&netty-all&
&4.0.34.Final&
在作者写作本文时,Maven中央仓库中Netty 最新版本为5.0.0.Alpha2,release版本为4.0.34.Final,故后期所有Netty版本皆使用4.0.34.Final版本。
3.server端
HelloWorldServer.java
package com.ricky.codelab.netty.ch1;
import com.ricky.codelab.netty.util.C
import io.netty.bootstrap.ServerB
import io.netty.channel.ChannelF
import io.netty.channel.ChannelI
import io.netty.channel.EventLoopG
import io.netty.channel.nio.NioEventLoopG
import io.netty.channel.socket.SocketC
import io.netty.channel.socket.nio.NioServerSocketC
import io.netty.handler.codec.string.StringD
import io.netty.handler.codec.string.StringE
* Hello world Server.
public class HelloWorldServer {
private int
public HelloWorldServer(int port) {
this.port =
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer&SocketChannel&() {
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder(), new StringDecoder(), new HelloWorldServerHandler());
ChannelFuture f = b.bind(port).sync();
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
public static void main(String[] args) throws Exception {
new HelloWorldServer(Constant.PORT).run();
HelloWorldServerHandler.java
package com.ricky.codelab.netty.ch1;
import io.netty.channel.ChannelHandlerC
import io.netty.channel.ChannelInboundHandlerA
* Handles a server-side channel.
public class HelloWorldServerHandler extends ChannelInboundHandlerAdapter {
public void channelRead(ChannelHandlerContext ctx, Object msg) {
System.out.println("server receive:"+msg);
ctx.writeAndFlush("Hello [from server]");
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
4.client端
HelloWorldClient.java
package com.ricky.codelab.netty.ch1
import com.ricky.codelab.netty.util.Constant
import io.netty.bootstrap.Bootstrap
import io.netty.channel.ChannelFuture
import io.netty.channel.ChannelInitializer
import io.netty.channel.EventLoopGroup
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.SocketChannel
import io.netty.channel.socket.nio.NioSocketChannel
import io.netty.handler.codec.string.StringDecoder
import io.netty.handler.codec.string.StringEncoder
public class HelloWorldClient {
private String host
private int port
public HelloWorldClient(String host, int port) {
this.host = host
this.port = port
public void send() throws InterruptedException {
Bootstrap bootstrap = new Bootstrap()
EventLoopGroup eventLoopGroup = new NioEventLoopGroup()
bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class)
.handler(new ChannelInitializer&SocketChannel&() {
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder(), new StringDecoder(), new HelloWorldClientHandler())
ChannelFuture future = bootstrap.connect(host, port).sync()
future.channel().closeFuture().sync()
} finally {
eventLoopGroup.shutdownGracefully()
public static void main(String[] args) throws Exception {
new HelloWorldClient(Constant.HOST, Constant.PORT).send()
HelloWorldClientHandler.java
package com.ricky.codelab.netty.ch1;
import io.netty.channel.ChannelHandlerC
import io.netty.channel.ChannelInboundHandlerA
* Handles a client-side channel.
public class HelloWorldClientHandler extends ChannelInboundHandlerAdapter {
public void channelActive(ChannelHandlerContext ctx) throws Exception {
super.channelActive(ctx);
System.out.println("client send message");
ctx.writeAndFlush("Hello world![from client]");
public void channelRead(ChannelHandlerContext ctx, Object msg) {
System.out.println("client receive:" + msg);
ctx.close();
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
在Netty中通信都是基于流来传递的,即以byte的形式传递。所以,我们需要将需要传递的String转换成byte数组。
在Netty4中提供了StringEncoder和StringDecoder来达到这一目的,类似的还有ObjectEncoder和ObjectDecoder来将Object转换为byte数组。
先启动HelloWorldServer.java,然后启动HelloWorldClient.java,此时在控制台就能看到打印的输出了。
源代码下载
上述源代码均已上传到GitHub,需要下载源代码的童鞋进行下载。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:890757次
积分:12982
积分:12982
排名:第684名
原创:436篇
转载:24篇
评论:397条
阅读:2269
文章:24篇
阅读:24059
(2)(16)(24)(9)(27)(10)(7)(6)(4)(14)(1)(3)(1)(1)(3)(2)(6)(4)(8)(10)(5)(6)(5)(8)(13)(12)(14)(11)(22)(13)(13)(13)(16)(16)(18)(13)(11)(22)(17)(48)(11)netty 5 与 4 区别-中国学网
netty 5 与 4 区别
状态:2个回答日期:回答人:神级人氏答:Netty和mian比较报告 数据测试报告 简述:1、启动服务器,等到客户端接入 2、客户端发送链接请求。当已经链接,记录当前时间并向服务端发送约50m数据,每次1kb. 3、当服务端接收到链接,第一次接收到数据后,记录当前时间 4、服务端将接收到的数...状态:1个回答日期:回答人:Du知道君答:我用3用习惯了,不过4好想支持JDK7.但是现在JDK用到生产环境的应该还不多。所以,还是3放心点状态:1个回答日期:回答人:中国学网网友答:进程间通信机制 1 文件映射 文件映射(Memory-Mapped Files)能使进程文件内容作进程址区间块内存待进程必使用文件I/O操作需简单指针操作读取修改文件内容 Win32 API允许进程访问同文件映射象各进程自址空间接收内存指针通使用些指针同进程读或修...状态:1个回答日期:回答人:Du知道君答:Netty和mian比较报告 一、数据测试报告 简述:1、启动服务器,等到客户端接入 2、客户端发送链接请求。当已经链接,记录当前时间并向服务端发送约50m数据,每次1kb. 3、当服务端接收到链接,第一次接收到数据后,记录当前时间 4、服务端将接收到...状态:1个回答日期:回答人:中国学网网友问:Netty4 服务器开启后, 检测是否成功连接,telnet 拼是否通过答:1:请检查服务器是否开启了并且内网电脑能成功访问 2:检查路由器的端口映射的配置是否正确 3:查看自己电脑对应的服务和端口有没甫颠咳郯纠奠穴订膜有打开! 4:请检查您是否映射了服务器所需的所有端口,有可能没有完全设置访问服务器所需的...状态:3个回答日期:回答人:彡落叶丶飘扬答:相比Netty3, Netty4有很多显著的变化: NioEventLoopGroup 是一个处理I/O操作的多线程事件环。即为Netty4里的线程池,在3.x里,一个Channel是由ChannelFactory创建的,同时新创建的Channel会自动注册到一个隐藏的I/O线程。 4.0使用新的名为Event...状态:1个回答日期:回答人:Du知道君答:netty v3.9.4 websocket连接建立前,客户端需要与服务器进行握手(http协议) 确认websocket连接,也就是说在处理websocket请求前,必需要处理一些http请求。 websocket到现在为止,已经有多个版本,netty有相应的对应类,这部分处理一般不需要...状态:1个回答日期:回答人:中国学网网友答:netty4怎么实现分片上传,断点续传 JAVA WEB文件上传步骤如下: 实现 Web 开发中的文件上传功能,两个操作:在 Web 页面添加上传输入项,在 Servlet 中读取上传文件的数据并保存在本地硬盘中。 1、Web 端上传文件。在 Web 页面中添加上传输入项...状态:1个回答日期:回答人:中国学网网友答:public static void main(String[] args) { // TODO Auto-generated method stub Socket socket= BufferedReader sockIn; PrintWriter sockO try{ socket=new Socket("127.0.0.1",8888); //建立socket连接,连接本机地址,8888端口 if(s...
与【netty 5 与 4 区别】相关信息:&&&&&&&&&&&&&&&&&&&&
用户还关注
大类导航: |

我要回帖

更多关于 netty 5.x与4.x区别 的文章

 

随机推荐