1. Netty簡介java
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()回調函數用於在創建鏈接的時候,看下面的例子:ide
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(); } } });