熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Mina框架研究

2022-06-13   來源: Java核心技術 

  IoService

  IoService是一個接口有兩種實現IoAcceptor和IoConnector;其中IoAcceptor是針對Server端的實現IoConnector是針對Client端的實現IoService的職責包括

  監聽器管理

  IoHandler

  IoSession管理

  FilterChain管理

  Statistics管理

  image

  IoAcceptor

  主要用於創建新的連接MINA提供了多種實現所以幾乎不需要我們自己再去實現

  NioSocketAcceptor無阻塞的Socket 傳輸Acceptor針對TCP

  NioDatagramAcceptor : 無阻塞的Socket 傳輸Acceptor針對UDP

  AprSocketAcceptor : 阻塞的Socket 傳輸Acceptor基於 APR

  VmPipeSocketAcceptor : the inVM Acceptor

  IoConnector

  針對Client端的Socket連接有多種實現

  NioSocketConnector : 無阻塞的Socket 傳輸Connector針對TCP
NioDatagramConnector : 無阻塞的Socket 傳輸Connector針對UDP
AprSocketConnector : 阻塞的Socket 傳輸Connector基於 APR 

  ProxyConnector : 一個支持代理服務的 Connector 通過截取連接的請求並將終端指向代理設置的地址

  SerialConnector : 針對串口傳輸的Connector

  VmPipeConnector : the inVM * Connector*

  Session

  任何時候只要有新的連接到來都會生成一個Session對象並且一致保存在內存中只到連接斷開

  Session有一系列狀態如下

  Connected : session被創建並有效
Idle : session至少在一個空閒周期(見配置)內沒有處理過任何請求
Idle for read : 在一個空閒周期內沒有做實際的讀操作

  Idle for write : 在一個空閒周期內沒有做實際的寫操作

  Idle for both : 在一個空閒周期內沒有做實際的讀和寫操作
Closing :session正在被關閉

  Closed : session已經被關閉

  image

  IoBuffer

  IoBuffer是MINA內部使用的一個byte bufferMINA並沒有直接使用NIO 的ByteBuffer不過IoBuffer 是對 ByteBuffer 的一個封裝IoBuffer 中的很多方法都是對 ByteBuffer 的直接繼承只是對 ByteBuffer 添加了一些擴展了更加實用的方法

  基本用法

  由於IoBuffer是對Nio的ByteBuffer 的封裝所以基本概念還是相同的下面簡單介紹一下

  capacity該屬性描述這個緩沖區最多能緩沖多少個元素也是Buffer最大存儲元素數這個值是在創建Buffer的時候指定的且不能修改

  Limit在從Buffer中向Channel中寫數據時limit變量指示了還剩多少數據可以讀取在從Channel中讀取數據到Buffer中時limit變量指示了還剩多少空間可供存放數據position正常情況下小於或者等於limit

  PositionBuffer實際上也就是個array當你從Channel中讀數據時你把從Channel中讀出來的數據放進底層arrayposition變量用來跟蹤截止目前為止已經寫了多少數據更精確的講它指示如果下次寫Buffer時數據應該進入array的哪個位置因此如果已經從Channel中讀出了個字節Buffer的position會被置為指向array中第四個位置

  Mark一個可以記憶的Position位置的值在調用reset()方法時會將緩沖區的Position重置為該索引並非總是需要定義Mark但是在定義Mark時不能將其定義為負數並且不能讓它大於Position如果定義了Mark則在該Position或Limit調整為小於該Mark值時該Mark將被丟棄

  下面通過一個例子來說明

  i初始狀態下

  此時position為limit和capacity都被設為

  image

  ii從Channel中讀入個字節數據到Buffer這時position指向(第個)

  image

  iii在做寫操作之前我們必須調用一次flip()方法這個方法做了兩件重要的事情
將limit設置到當前的position處
設置position為

  image

  iiii執行寫操作後;

  image

  iv執行clear後position設為limit設為capitionmark則丟棄

  image

  因為IoBuffer是一個抽象類不能直接實例化所有使用的時候需要調用allocate方法來進行內存分配

  allocate有兩種定義



  : // Allocates a new buffer with a specific size defining its type (direct or heap)

  : public static IoBuffer allocate(int capacity boolean direct)

  

  : // Allocates a new buffer with a specific size

  : public static IoBuffer allocate(int capacity)

  這裡

  capacitybuffer的大小

  direct如果為true則得到direct buffer如果為false則得到heap buffer

  direct buffer和heap buffer的區別分析

  Direct Buffer不是分配在堆上的它不被GC直接管理(但Direct Buffer的JAVA對象是歸GC管理的只要GC回收了它的JAVA對象操作系統才會釋放Direct Buffer所申請的空間)它似乎給人感覺是內核緩沖區(buffer in kernel)Heap Buffer則是分配在堆上的或者我們可以簡單理解為Heap Buffer就是byte[]數組的一種封裝形式當我們把一個Heap Buffer寫入Channel的時候實際上底層實現會先構建一個臨時的Direct Buffer然後把Heap Buffer的內容復制到這個臨時的Direct Buffer上再把這個Direct Buffer寫出去因此把一個Direct Buffer寫入一個Channel的速度要比把一個Heap Buffer寫入一個Channel的速度要快但是Direct Buffer創建和銷毀的代價很高所以要用在盡可能重用的地方

  public static IoBuffer allocate(int capacity)的用法



  : // 設置Allocates分配的默認類型這裡設為heap buffer

  : IoBuffersetUseDirectBuffer(false);

  : // 返回一個新的heap buffer

  : IoBuffer buf = IoBufferallocate();

  IoBuffer允許生成一個自動擴展的buffer(這也是沒有選擇使用NIO的ByteBuffer的原因之一)通過設置AutoExpand屬性即可



  : IoBuffer buffer = IoBufferallocate();

  : buffersetAutoExpand(true);

  

  : bufferputString( encoder);

  :

  : // Add more to this buffer

  : bufferput((byte));


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26980.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.