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. 仿手机QQ消息小红点动画2

    前言 上一篇把动画的实现步骤大致理清,需要确认小尾巴的绘制区域,关键就是确定4个顶点的位置.大家可以根据需要,选择不同的计算方式. 今天,要实现: 文字的添加 尾巴拉长用弧形代替直线 下面是现在的效果 ...

  2. Java并发编程(四)锁的使用(上)

    锁的作用 锁是一种线程同步机制,用于实现互斥,当线程占用一个对象锁的时候,其它线程如果也想使用这个对象锁就需要排队.如果不使用对象锁,不同的线程同时操作一个变量的时候,有可能导致错误.让我们做一个测试 ...

  3. 832. Flipping an Image (5月22日 )

    解答 class Solution { public: vector<vector<int>> flipAndInvertImage(vector<vector<i ...

  4. ABAP术语-Update Key

    Update Key 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/20/1114171.html Unique character str ...

  5. python使用findall正则匹配出所有符合条件的字符串

    # -*- coding:utf-8 -*- import re mystr="qqq key:www.baidu.com<br>key:www.tengxun.com<b ...

  6. jquery购物车添加功能

    <html> <head> <meta charset="UTF-8"> <title></title> <scr ...

  7. iOS通过切片仿断点机制上传文件

    项目开发中,有时候我们需要将本地的文件上传到服务器,简单的几张图片还好,但是针对iPhone里面的视频文件进行上传,为了用户体验,我们有必要实现断点上传.其实也不是真的断点,这里我们只是模仿断点机制. ...

  8. 大数据学习--day17(Map--HashMap--TreeMap、红黑树)

    Map--HashMap--TreeMap--红黑树 Map:三种遍历方式 HashMap:拉链法.用哈希函数计算出int值. 用桶的思想去存储元素.桶里的元素用链表串起来,之后长了的话转红黑树. T ...

  9. spark or sparkstreaming的内存泄露问题?

    关于sparkstreaming的无法正常产生数据---->到崩溃---->到数据读写极为缓慢(或块丢失?)问题 前两阶段请看我的博客:https://www.cnblogs.com/wa ...

  10. 一些有趣的 Shell 命令

    find . -name "*.db" -type f 查找当前路径下名称满足正则*.db的文件,-type d 则是查找文件夹 grep -rn "Main" ...