`
luotianwen456123
  • 浏览: 6553 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Netty

 
阅读更多
Netty是什么?

本质:JBoss做的一个Jar包

目的:快速开发高性能、高可靠性的网络服务器和客户端程序

优点:提供异步的、事件驱动的网络应用程序框架和工具

通俗的说:一个好使的处理Socket的东东


如果没有Netty?

远古:java.net + java.io

近代:java.nio

其他:Mina,Grizzly

为什么不是Mina?

1、都是Trustin Lee的作品,Netty更晚;
2、Mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比下性能会有所下降,Netty解决了这个设计问题;
3、Netty的文档更清晰,很多Mina的特性在Netty里都有;
4、Netty更新周期更短,新版本的发布比较快;
5、它们的架构差别不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度非常高,Netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);
6、Netty比Mina使用起来更简单,Netty里你可以自定义的处理upstream events 或/和 downstream events,可以使用decoder和encoder来解码和编码发送内容;
7、Netty和Mina在处理UDP时有一些不同,Netty将UDP无连接的特性暴露出来;而Mina对UDP进行了高级层次的抽象,可以把UDP当成"面向连接"的协议,而要Netty做到这一点比较困难。


Netty的特性

设计
统一的API,适用于不同的协议(阻塞和非阻塞)
基于灵活、可扩展的事件驱动模型
高度可定制的线程模型
可靠的无连接数据Socket支持(UDP)

性能
更好的吞吐量,低延迟
更省资源
尽量减少不必要的内存拷贝

安全
完整的SSL/TLS和STARTTLS的支持
能在Applet与Android的限制环境运行良好

健壮性
不再因过快、过慢或超负载连接导致OutOfMemoryError
不再有在高速网络环境下NIO读写频率不一致的问题

易用
完善的JavaDoc,用户指南和样例
简洁简单
仅信赖于JDK1.5

看例子吧!

Server端:

Java代码  收藏代码
package me.hello.netty; 
 
import org.jboss.netty.bootstrap.ServerBootstrap; 
import org.jboss.netty.channel.*; 
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; 
import org.jboss.netty.handler.codec.string.StringDecoder; 
import org.jboss.netty.handler.codec.string.StringEncoder; 
 
import java.net.InetSocketAddress; 
import java.util.concurrent.Executors; 
 
/**
* God Bless You!
* Author: Fangniude
* Date: 2013-07-15
*/ 
public class NettyServer { 
    public static void main(String[] args) { 
        ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); 
 
        // Set up the default event pipeline. 
        bootstrap.setPipelineFactory(new ChannelPipelineFactory() { 
            @Override 
            public ChannelPipeline getPipeline() throws Exception { 
                return Channels.pipeline(new StringDecoder(), new StringEncoder(), new ServerHandler()); 
            } 
        }); 
 
        // Bind and start to accept incoming connections. 
        Channel bind = bootstrap.bind(new InetSocketAddress(8000)); 
        System.out.println("Server已经启动,监听端口: " + bind.getLocalAddress() + ", 等待客户端注册。。。"); 
    } 
 
    private static class ServerHandler extends SimpleChannelHandler { 
        @Override 
        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
            if (e.getMessage() instanceof String) { 
                String message = (String) e.getMessage(); 
                System.out.println("Client发来:" + message); 
 
                e.getChannel().write("Server已收到刚发送的:" + message); 
 
                System.out.println("\n等待客户端输入。。。"); 
            } 
 
            super.messageReceived(ctx, e); 
        } 
 
        @Override 
        public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { 
            super.exceptionCaught(ctx, e); 
        } 
 
        @Override 
        public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { 
            System.out.println("有一个客户端注册上来了。。。"); 
            System.out.println("Client:" + e.getChannel().getRemoteAddress()); 
            System.out.println("Server:" + e.getChannel().getLocalAddress()); 
            System.out.println("\n等待客户端输入。。。"); 
            super.channelConnected(ctx, e); 
        } 
    } 


客户端:

Java代码  收藏代码
package me.hello.netty; 
 
import org.jboss.netty.bootstrap.ClientBootstrap; 
import org.jboss.netty.channel.*; 
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; 
import org.jboss.netty.handler.codec.string.StringDecoder; 
import org.jboss.netty.handler.codec.string.StringEncoder; 
 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.InetSocketAddress; 
import java.util.concurrent.Executors; 
 
/**
* God Bless You!
* Author: Fangniude
* Date: 2013-07-15
*/ 
public class NettyClient { 
 
    public static void main(String[] args) { 
        // Configure the client. 
        ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); 
 
        // Set up the default event pipeline. 
        bootstrap.setPipelineFactory(new ChannelPipelineFactory() { 
            @Override 
            public ChannelPipeline getPipeline() throws Exception { 
                return Channels.pipeline(new StringDecoder(), new StringEncoder(), new ClientHandler()); 
            } 
        }); 
 
        // Start the connection attempt. 
        ChannelFuture future = bootstrap.connect(new InetSocketAddress("localhost", 8000)); 
 
        // Wait until the connection is closed or the connection attempt fails. 
        future.getChannel().getCloseFuture().awaitUninterruptibly(); 
 
        // Shut down thread pools to exit. 
        bootstrap.releaseExternalResources(); 
    } 
 
    private static class ClientHandler extends SimpleChannelHandler { 
        private BufferedReader sin = new BufferedReader(new InputStreamReader(System.in)); 
 
        @Override 
        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { 
            if (e.getMessage() instanceof String) { 
                String message = (String) e.getMessage(); 
                System.out.println(message); 
 
                e.getChannel().write(sin.readLine()); 
 
                System.out.println("\n等待客户端输入。。。"); 
            } 
 
            super.messageReceived(ctx, e); 
        } 
 
        @Override 
        public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { 
            System.out.println("已经与Server建立连接。。。。"); 
            System.out.println("\n请输入要发送的信息:"); 
            super.channelConnected(ctx, e); 
 
            e.getChannel().write(sin.readLine()); 
        } 
    } 


Netty整体架构



Netty组件

ChannelFactory
Boss
Worker
Channel
ChannelEvent
Pipeline
ChannelContext
Handler
Sink

Server端核心类
NioServerSocketChannelFactory
NioServerBossPool
NioWorkerPool
NioServerBoss
NioWorker
NioServerSocketChannel
NioAcceptedSocketChannel
DefaultChannelPipeline
NioServerSocketPipelineSink
Channels


ChannelFactory
Channel工厂,很重要的类
保存启动的相关参数

NioServerSocketChannelFactory
NioClientSocketChannelFactory
NioDatagramChannelFactory

这是Nio的,还有Oio和Local的


SelectorPool

Selector的线程池

NioServerBossPool 默认线程数:1
NioClientBossPool      1
NioWorkerPool      2 * Processor
NioDatagramWorkerPool


Selector

选择器,很核心的组件

NioServerBoss
NioClientBoss
NioWorker
NioDatagramWorker


Channel

通道

NioServerSocketChannel
NioClientSocketChannel
NioAcceptedSocketChannel
NioDatagramChannel

Sink
负责和底层的交互
如bind,Write,Close等

NioServerSocketPipelineSink
NioClientSocketPipelineSink
NioDatagramPipelineSink

Pipeline
负责维护所有的Handler

ChannelContext
一个Channel一个,是Handler和Pipeline的中间件

Handler
对Channel事件的处理器


ChannelPipeline







优秀的设计----事件驱动




优秀的设计----线程模型



注意事项

解码时的Position

Channel的关闭

更多Handler


Channel的关闭

用完的Channel,可以直接关闭;
1、ChannelFuture加Listener
2、writeComplete

一段时间没用,也可以关闭
TimeoutHandler
0
4
分享到:
评论

相关推荐

    Netty实战 电子版.pdf_java_netty_服务器_

    《Netty实战》是针对Java开发者的一本技术指南,它深入介绍了如何利用Netty这个高性能、异步事件驱动的网络应用程序框架来构建高效且可扩展的网络应用。Netty不仅简化了网络编程的复杂性,还提供了丰富的特性和组件...

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    Netty (netty-3.2.5.Final.jar,netty-3.2.5.Final-sources.jar)

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个压缩包包含 `netty-3.2.5.Final.jar` 和 `netty-3.2.5.Final-sources.jar` 两个文件,它们分别代表了...

    netty-netty-4.1.69.Final.tar.gz

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“netty-netty-4.1.69.Final.tar.gz”文件是Netty的最新稳定版本,版本号为4.1.69.Final,它是一个压缩包...

    跟闪电侠学Netty:Netty即时聊天实战与底层原理-book-netty.zip

    《跟闪电侠学Netty:Netty即时聊天实战与底层原理》是一本深入浅出的Netty技术指南,旨在帮助读者掌握Netty框架,并利用它实现即时聊天应用,同时理解其底层工作原理。Netty是Java领域的一款高性能、异步事件驱动的...

    netty-netty-3.10.6.Final.tar.gz

    Netty (netty-netty-3.10.6.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    Netty进阶之路-跟着案例学Netty

    《Netty进阶之路-跟着案例学Netty》是由知名技术专家李林峰撰写的一本专为Java开发者深入理解Netty框架而准备的书籍。这本书旨在通过实例教学,帮助读者全面掌握Netty的核心特性和实战技巧,提升网络编程的能力。 ...

    Netty (netty-netty-4.1.77.Final.tar.gz)

    Netty (netty-netty-4.1.77.Final.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    Netty 完整依赖的jar包, 你只需要下载netty源码,再添加这些jar就可以编译通过了

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Java开发领域,Netty因其强大的功能和高效性能而备受推崇,广泛应用于分布式系统、云计算、游戏服务器等...

    netty-4.1.17.Final.jar

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"Netty-4.1.17.Final.jar"是Netty框架的一个发行版本,它适用于Java 8及以上版本,这意味着它可以充分...

    netty官网学习手册中文版

    这个“netty官网学习手册中文版”针对的是Netty的3.1版本,虽然现在的Netty已经发展到了5.x版本,但3.1版本的知识仍然具有历史参考价值,特别是对于那些初次接触或需要理解Netty基础概念的开发者来说。 1. **Netty...

    整合netty实时通讯

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 实时通讯的原理与应用,以及如何利用它构建 WebSocket 服务。 WebSocket 是...

    最新netty中文文档chm版

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个“最新Netty中文文档CHM版”为中国的开发者提供了一个方便的中文学习资源,解决了阅读英文原版文档时的...

    netty5.0官方自带的demo

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨Netty 5.0官方提供的示例(demo),这些示例是学习和理解Netty核心概念与功能的重要...

    netty框架 jar包

    Netty是一个开源的Java框架,专门用于构建高性能、高可靠性的网络应用,如服务器和客户端。这个"Netty框架 jar包"很可能包含了Netty 4.1.6版本的库文件,使得开发者能够轻松地在自己的项目中集成Netty的功能。 ...

    netty4与spring集成

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Spring 是一个广泛使用的 Java 应用开发框架,尤其在企业级应用中非常流行,它提供了依赖注入、面向切面编程...

    netty-all-4.1.32.Final-sources.jar 最新版netty源码全部包

    netty-buffer-4.1.32.Final-sources.jar netty-buffer-4.1.32.Final.jar netty-build-22-sources.jar netty-build-22.jar netty-codec-4.1.32.Final-sources.jar netty-codec-4.1.32.Final.jar netty-codec-...

    netty实现的聊天代码

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个“netty实现的聊天代码”中,我们可以深入理解如何使用 Netty 框架来构建简单的聊天应用。这个 demo ...

    netty+4G DTU

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 如何与 4G DTU 设备结合,以及如何构建基于 Java 的物联网(IoT)解决方案。...

    netty-all-4.1.29.Final-sources.jar 最新版netty源码

    本jar包为最新的netty-all-4.1.29c.jar 可导入直接用 Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架...

Global site tag (gtag.js) - Google Analytics