zoukankan      html  css  js  c++  java
  • 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();
            } 
        }
    });
  • 相关阅读:
    PAT 00-自测1. 打印沙漏(20)
    js Ajax
    c语言算法实现
    解决python for vs在vs中无法使用中文
    python排序算法实现:
    2014-4-27 心情
    Sdut 2416 Fruit Ninja II(山东省第三届ACM省赛 J 题)(解析几何)
    Poj 1061 青蛙的约会(扩展欧几里得)
    hrbust 1328 相等的最小公倍数(数论)
    hdu 1286 找新朋友 (欧拉函数)
  • 原文地址:https://www.cnblogs.com/davidgu/p/8608985.html
Copyright © 2011-2022 走看看