• Netty实战


    1. Netty简介

    Netty是由JBOSS提供的一个java开源框架。
    它提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
    Netty是一个基于NIO的客户端/服务器端编程框架。

    Netty的成功案例:
    Alibaba Dubbo, HornetQ, Vert.x, Apache Cassandra, and Elastic Search上述著名产品都使用Netty
    编写其核心的网络通信模块。

    2. Netty核心组件

    ■ Channels
    ■ Callbacks
    ■ Futures
    ■ Events and handlers

    2-1) Channel
    Channel是一个基本的Java NIO结构。
    它表示连接到一些实体,这些实体可以是硬件设备,一个文件,一个网络套接字,或者一个
    执行一些独立I/O操作的程序组件,比如读写。
    Channel可以打开或关闭, 连接或断开。

    2-2) Callbacks
    Callbacks也就是我们常说的回调函数。
    在Netty中我们在事件中使用回调函数:
    比如channelActive()回调函数用于在建立连接的时候,看下面的例子:

    public class ConnectHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("Client " + ctx.channel().remoteAddress() + " connected");
         } 
    }

    2-3)Futures

    当一个操作结束的时候,我们可以通过Future来通知应用程序。

    它就像一个异步操作的返回结果的占位符(placeholder)。
    在未来的某个时间点结束,并且可以提供访问。

    这里你会想到Java基本类的java.util.concurrent.Future

    但是JDK的Future有点累赘,它会让你在程序未结束之前一直处于阻塞状态,你必须进行手工的检查,性能有点差!

    Netty提供了对于Future的自己的实现ChannelFuture,它提供了五阻塞的Future结构。

    异步连接

    Channel channel = ...;
    // 无阻塞的异步连接Future结构
    ChannelFuture future = channel.connect(new InetSocketAddress("192.168.0.1", 25));

    我们还可以在ChannelFuture中注册ChannelFutureListener来监听
    异步数据传输的状态,以便我们做出进一步的处理,例如:

    Channel channel = ...;
    ChannelFuture future = channel.connect(new InetSocketAddress("192.168.0.1", 25));
    future.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) {
            if (future.isSuccess()){
                ByteBuf buffer = Unpooled.copiedBuffer("Hello",Charset.defaultCharset());
                ChannelFuture wf = future.channel()
                    .writeAndFlush(buffer);
                ....
            } else {
                Throwable cause = future.cause();
                cause.printStackTrace();
            } 
        }
    });
  • 相关阅读:
    一款纯css3实现的响应式导航
    一款基于TweenMax.js的网页幻灯片
    4款基于jquery的列表图标动画切换特效
    随着鼠标移动的文字阴影
    一款纯css实现的垂直时间线效果
    一款基于jquery的侧边栏导航
    (转) 共享个很棒的vim配置
    [Leetcode] String to Integer (atoi)
    dia无法输入中文?
    [Leetcode] Sum Root to Leaf Numbers
  • 原文地址:https://www.cnblogs.com/davidgu/p/8608985.html
Copyright © 2020-2023  润新知