Java NIO框架Netty教程(一) – Hello Netty

原文轉載自:http://blog.csdn.net/kobejayandy/article/details/11493717


先囉嗦兩句,如果你還不知道Netty是做什麼的能做什麼。那可以先簡單的搜索瞭解一下。我只能說Netty是一個NIO的框架,可以用於開發分佈式的Java程序。具體能做什麼,各位可以儘量發揮想象。技術,是服務於人而不是侷限住人的。

如果你已經萬事具備,那麼我們先從一段代碼開始。程序員們習慣的上手第一步,自然是"Hello world",不過Netty官網的例子卻偏偏拋棄了"Hello world"。那我們就自己寫一個最簡單的"Hello world"的例子,作爲上手。

[java] view plaincopy
  1. /** 
  2.  * Netty 服務端代碼 
  3.  *  
  4.  * @author lihzh 
  5.  * @alia OneCoder 
  6.  * @blog http://www.coderli.com 
  7.  */  
  8. public class HelloServer {  
  9.   
  10.     public static void main(String args[]) {  
  11.         // Server服務啓動器  
  12.         ServerBootstrap bootstrap = new ServerBootstrap(  
  13.                 new NioServerSocketChannelFactory(  
  14.                         Executors.newCachedThreadPool(),  
  15.                         Executors.newCachedThreadPool()));  
  16.         // 設置一個處理客戶端消息和各種消息事件的類(Handler)  
  17.         bootstrap  
  18.                 .setPipelineFactory(new ChannelPipelineFactory() {  
  19.                     @Override  
  20.                     public ChannelPipeline getPipeline()  
  21.                             throws Exception {  
  22.                         return Channels  
  23.                                 .pipeline(new HelloServerHandler());  
  24.                     }  
  25.                 });  
  26.         // 開放8000端口供客戶端訪問。  
  27.         bootstrap.bind(new InetSocketAddress(8000));  
  28.     }  
  29.   
  30.     private static class HelloServerHandler extends  
  31.             SimpleChannelHandler {  
  32.   
  33.         /** 
  34.          * 當有客戶端綁定到服務端的時候觸發,打印"Hello world, I'm server." 
  35.          *  
  36.          * @alia OneCoder 
  37.          * @author lihzh 
  38.          */  
  39.         @Override  
  40.         public void channelConnected(  
  41.                 ChannelHandlerContext ctx,  
  42.                 ChannelStateEvent e) {  
  43.             System.out.println("Hello world, I'm server.");  
  44.         }  
  45.     }  
  46. }  
[java] view plaincopy
  1. /** 
  2.  * Netty 客戶端代碼 
  3.  *  
  4.  * @author lihzh 
  5.  * @alia OneCoder 
  6.  * @blog http://www.coderli.com 
  7.  */  
  8. public class HelloClient {  
  9.   
  10.     public static void main(String args[]) {  
  11.         // Client服務啓動器  
  12.         ClientBootstrap bootstrap = new ClientBootstrap(  
  13.                 new NioClientSocketChannelFactory(  
  14.                         Executors.newCachedThreadPool(),  
  15.                         Executors.newCachedThreadPool()));  
  16.         // 設置一個處理服務端消息和各種消息事件的類(Handler)  
  17.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  18.             @Override  
  19.             public ChannelPipeline getPipeline() throws Exception {  
  20.                 return Channels.pipeline(new HelloClientHandler());  
  21.             }  
  22.         });  
  23.         // 連接到本地的8000端口的服務端  
  24.         bootstrap.connect(new InetSocketAddress(  
  25.                 "127.0.0.1"8000));  
  26.     }  
  27.   
  28.     private static class HelloClientHandler extends SimpleChannelHandler {  
  29.   
  30.   
  31.         /** 
  32.          * 當綁定到服務端的時候觸發,打印"Hello world, I'm client." 
  33.          *  
  34.          * @alia OneCoder 
  35.          * @author lihzh 
  36.          */  
  37.         @Override  
  38.         public void channelConnected(ChannelHandlerContext ctx,  
  39.                 ChannelStateEvent e) {  
  40.             System.out.println("Hello world, I'm client.");  
  41.         }  
  42.     }  
  43. }  

既然是分佈式的,自然要分多個服務。Netty中,需要區分Server和Client服務。所有的Client都是綁定在Server上的,他們之間是不能通過Netty直接通信的。(自己採用的其他手段,不包括在內。)。白話一下這個通信過程,Server端開放端口,供Client連接,Client發起請求,連接到Server指定的端口,完成綁定。隨後便可自由通信。其實就是普通Socket連接通信的過程。

Netty框架是基於事件機制的,簡單說,就是發生什麼事,就找相關處理方法。就跟着火了找119,搶劫了找110一個道理。所以,這裏,我們處理的是當客戶端和服務端完成連接以後的這個事件。什麼時候完成的連接,Netty知道,他告訴我了,我就負責處理。這就是框架的作用。Netty,提供的事件還有很多,以後會慢慢的接觸和介紹。

你應該已經可以上手了:)


發佈了26 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章