Java NIO架構MINA中文教程__Java

來源:互聯網
上載者:User
      現在已經是World Wide Web的時代,無數的web應用程式框架被創造出來從而大大的提高了web開發的速度。拋開WWW的這個優勢,我們知道還有很多協議是HTTP協議所無法替代的。有時,我們仍然需要構造c/s應用來實現適當的協議。

 === MINA是什麼? ===
 你有沒有曾經使用java或者其他語言實現過某個協議棧。就像你所經曆過的那樣,編寫網路應用即使對於有經驗的開發人員也不是容易的事情。這歸咎於以下幾個方面:
 
   * 沒有為開發人員設計的合適的網路應用程式框架. 
     * 使你無法在有限的時間內建立你的應用. 
   * 網路I/O編碼,訊息的編/解碼,商務邏輯常常糾纏在一起. 
     * 使程式失去可維護性和可複用性 
   * 網路應用難於進行單元測試 
     * 你失去了敏捷性 
 
 MINA是一個網路應用程式框架,在不犧牲效能和可擴充性的前提下用於解決上面的所有問題。


 == I/O 層: 編寫一個 Echo Server ==
 MINA包含兩層:IO層和協議層。我們首先僅使用IO層來實現一個echo服務,因為協議層通常是建立在IO層之上的。 
 attachment:Arch1.gif
 上面的圖展示了MINA的IO層同用戶端的互動。IoAcceptor執行所有底層IO,將他們翻譯成抽象的IO事件,並把翻譯過的事件和關聯的IoSession
發送給IoHandler。


 === IoSession ===
 attachment:IoSession.gif
  一個代表了IoSession程式同一個遠程實體的IO串連。通過IoSession,你可以寫出message到遠程實體,訪問session的配置,並且更改session的屬性。


 === IoHandler === 
 attachment:IoHandler.gif
   * sessionCreated: 當一個IO串連建立時被調用,這個方法在任何IO操作之前被調用,以便socket參數或session屬效能夠最先被設定。
   * sessionOpened: 在sessionCreated調用之後被調用。
   * sessionClosed: 當IO串連被關閉時被調用。
   * sessionIdle: 當在遠程實體和使用者程式之間沒有資料轉送的時候被調用。
   * exceptionCaught: 當IoAcceptor 或者你的IoHandler.中出現異常時被調用。
   * messageReceived: 當接收到新的協議訊息時被調用。可以在這裡實現你的控制流程程。
   * messageSent: 當使用者請求的訊息通過 IoSession#write(Object) 確實發送後被調用。

 
 下面我們看看如何?echo協議的IoHandler。
 === 實現 IoHandler 以及啟動代碼 ===
 通常,應用需要繼承IoHandlerAdapter並實現需要的方法:
 

package  org.apache.mina.examples.echoserver;
 
  import  org.apache.mina.common.ByteBuffer;
  import  org.apache.mina.common.IoHandlerAdapter;
  import  org.apache.mina.common.IoSession;
  import  org.apache.mina.common.TransportType;
  import  org.apache.mina.transport.socket.nio.SocketSessionConfig;
 
  public   class  EchoProtocolHandler  extends  IoHandlerAdapter
  {
     public void sessionCreated( IoSession session )
     {
         if (session.getTransportType() == TransportType.SOCKET) {
           ((SocketSessionConfig)session.getConfig()).setReceiveBufferSize(2048);
     }
 
     public void exceptionCaught( IoSession session, Throwable cause )
     {
         session.close();
     }
 
     public void messageReceived( IoSession session, Object message )
     {
         if (!(message instanceof ByteBuffer))
             return;
      
         ByteBuffer rb = (ByteBuffer)message;
         // Write the received data back to remote peer
         ByteBuffer wb = ByteBuffer.allocate( rb.remaining() );
         wb.put( rb );
         wb.flip();
         session.write( wb );
     }
 }
  剛剛我們使用MINA實現echo協議,現在我們將handler綁定到一個server連接埠上。
import  java.net.InetSocketAddress;
  import  org.apache.mina.transport.socket.nio.SocketAcceptor;
  import  org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
 
  public   class  Main
  {
     /** Choose your favorite port number. */
     private static final int PORT = 8080;
     
 
     public static

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.