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端:

  1. package me.hello.netty;
  2. import org.jboss.netty.bootstrap.ServerBootstrap;
  3. import org.jboss.netty.channel.*;
  4. import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
  5. import org.jboss.netty.handler.codec.string.StringDecoder;
  6. import org.jboss.netty.handler.codec.string.StringEncoder;
  7. import java.net.InetSocketAddress;
  8. import java.util.concurrent.Executors;
  9. /**
  10. * God Bless You!
  11. * Author: Fangniude
  12. * Date: 2013-07-15
  13. */
  14. public class NettyServer {
  15. public static void main(String[] args) {
  16. ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
  17. // Set up the default event pipeline.
  18. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  19. @Override
  20. public ChannelPipeline getPipeline() throws Exception {
  21. return Channels.pipeline(new StringDecoder(), new StringEncoder(), new ServerHandler());
  22. }
  23. });
  24. // Bind and start to accept incoming connections.
  25. Channel bind = bootstrap.bind(new InetSocketAddress(8000));
  26. System.out.println("Server已经启动,监听端口: " + bind.getLocalAddress() + ", 等待客户端注册。。。");
  27. }
  28. private static class ServerHandler extends SimpleChannelHandler {
  29. @Override
  30. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  31. if (e.getMessage() instanceof String) {
  32. String message = (String) e.getMessage();
  33. System.out.println("Client发来:" + message);
  34. e.getChannel().write("Server已收到刚发送的:" + message);
  35. System.out.println("\n等待客户端输入。。。");
  36. }
  37. super.messageReceived(ctx, e);
  38. }
  39. @Override
  40. public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
  41. super.exceptionCaught(ctx, e);
  42. }
  43. @Override
  44. public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
  45. System.out.println("有一个客户端注册上来了。。。");
  46. System.out.println("Client:" + e.getChannel().getRemoteAddress());
  47. System.out.println("Server:" + e.getChannel().getLocalAddress());
  48. System.out.println("\n等待客户端输入。。。");
  49. super.channelConnected(ctx, e);
  50. }
  51. }
  52. }

客户端:

  1. package me.hello.netty;
  2. import org.jboss.netty.bootstrap.ClientBootstrap;
  3. import org.jboss.netty.channel.*;
  4. import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
  5. import org.jboss.netty.handler.codec.string.StringDecoder;
  6. import org.jboss.netty.handler.codec.string.StringEncoder;
  7. import java.io.BufferedReader;
  8. import java.io.InputStreamReader;
  9. import java.net.InetSocketAddress;
  10. import java.util.concurrent.Executors;
  11. /**
  12. * God Bless You!
  13. * Author: Fangniude
  14. * Date: 2013-07-15
  15. */
  16. public class NettyClient {
  17. public static void main(String[] args) {
  18. // Configure the client.
  19. ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
  20. // Set up the default event pipeline.
  21. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  22. @Override
  23. public ChannelPipeline getPipeline() throws Exception {
  24. return Channels.pipeline(new StringDecoder(), new StringEncoder(), new ClientHandler());
  25. }
  26. });
  27. // Start the connection attempt.
  28. ChannelFuture future = bootstrap.connect(new InetSocketAddress("localhost", 8000));
  29. // Wait until the connection is closed or the connection attempt fails.
  30. future.getChannel().getCloseFuture().awaitUninterruptibly();
  31. // Shut down thread pools to exit.
  32. bootstrap.releaseExternalResources();
  33. }
  34. private static class ClientHandler extends SimpleChannelHandler {
  35. private BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
  36. @Override
  37. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  38. if (e.getMessage() instanceof String) {
  39. String message = (String) e.getMessage();
  40. System.out.println(message);
  41. e.getChannel().write(sin.readLine());
  42. System.out.println("\n等待客户端输入。。。");
  43. }
  44. super.messageReceived(ctx, e);
  45. }
  46. @Override
  47. public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
  48. System.out.println("已经与Server建立连接。。。。");
  49. System.out.println("\n请输入要发送的信息:");
  50. super.channelConnected(ctx, e);
  51. e.getChannel().write(sin.readLine());
  52. }
  53. }
  54. }

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

转自: http://lippeng.iteye.com/blog/1907279

netty初认识的更多相关文章

  1. Netty初体验

    package netty_starter; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFut ...

  2. Netty学习记录-入门篇

    你如果,缓缓把手举起来,举到顶,再突然张开五指,那恭喜你,你刚刚给自己放了个烟花. 模块介绍 netty-bio: 阻塞型网络通信demo. netty-nio: 引入channel(通道).buff ...

  3. Netty 入门初体验

    Netty简介 Netty是一款异步的事件驱动的网络应用程序框架,支持快速开发可维护的高性能的面向协议的服务器和客户端.Netty主要是对java 的 nio包进行的封装 为什么要使用 Netty 上 ...

  4. 蚂蚁 RPC 框架 SOFA-RPC 初体验

    前言 最近蚂蚁金服开源了分布式框架 SOFA,楼主写了一个 demo,体验了一下 SOFA 的功能,SOFA 完全兼容 SpringBoot(当然 Dubbo 也是可以兼容的). 项目地址:Alipa ...

  5. Netty 介绍

    本指南对Netty 进行了介绍并指出其意义所在. 1. 问题 现在,我们使用适合一般用途的应用或组件来和彼此通信.例如,我们常常使用一个HTTP客户端从远程服务器获取信息或者通过web service ...

  6. 远程桌面控制项目开发(Spring+Netty+Swing)

    [目录] 1.前言 2.初现端倪 3.款款深入 4.责任细分 5.功能层级图 6.项目结构 7.关键类设计 8.一些设计想法 9.待优化 10.一点心得 11.效果演示 12.讨论 13.GitHub ...

  7. Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化

    Netty源码分析第一章:Netty启动流程   第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...

  8. Netty心跳之IdleStateHandler

    Netty提供了对心跳机制的天然支持,心跳可以检测远程端是否存活,或者活跃 今天我们就一起初识一下Netty4的心跳机制 Netty4.0提供了一个类,名为IdleStateHandler,这个类可以 ...

  9. 高性能无锁队列 Disruptor 初体验

    原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 最近一直在研究队列的一些问题,今天楼主要分享一个高性能的队列 Disr ...

随机推荐

  1. macOS:按钮类型

    for (int i = 0; i < 10; i++) { for (int j = 1; j < 16; j++) { NSButton *btn = [[NSButton alloc ...

  2. Scanner(基本用法初学)

    package day01; import java.util.Scanner; public class Case05 { public static void main(String[] args ...

  3. Easyui之accordion修改Title样式,字体等

    .accordion{background:#fff;overflow:hidden;}.accordion .accordion-header{background:#efefef;border-t ...

  4. 【PTA 天梯赛】L1-046 整除光棍(除法模拟)

    这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可以被13整除. 现在,你的程序 ...

  5. eclipse 打开一个新工程的基本设置

    1.代码自动提示 Window -> Preferences -> Java -> Editor -> Content Assist -> Auto Activation ...

  6. [译]C语言实现一个简易的Hash table(5)

    上一章中,我们使用了双重Hash的技术来处理碰撞,并用了C语言实现,贲张我们将实现Hash表中的插入.搜索和删除接口. 实现接口 我们的hash函数将会实现如下的接口: // hash_table.h ...

  7. 大数据分析系统Hadoop的13个开源工具

    Hadoop是由Apache基金会开发的一个大数据分布式系统基础架构,最早版本是2003年原Yahoo!DougCutting根据Google发布的学术论文研究而来. 用户可以在不了解分布式底层细节的 ...

  8. BurpSuite系列(十)----Extender模块(扩展器)

    一.简介 Burp在软件中提供了支持第三方拓展插件的功能,方便使用者编写自己的自定义插件或从插件商店中安装拓展插件.Burp扩展程序可以以多种方式支持自定义Burp的行为,例如:修改HTTP请求和响应 ...

  9. linux使用docker-compose部署软件配置

    本篇将分享一些 docker-compose 的配置,可参考其总结自己的一套基于docker的开发/生产环境配置.下面话不多说了,来一起看看详细的介绍吧 安装docker及docker-compose ...

  10. C#7特性