Netty实战 - 1. 基本概念

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();
        } 
    }
});

 

posted @ 2018-03-20 15:01  Master HaKu  阅读(601)  评论(0编辑  收藏  举报