Mina各元件介紹
Mina各元件介紹
上一篇文章已經系統的介紹了Mina的執行流程,Apache推出的Mina效能上很是高效,上章節我們知道內部有很多的類,各個類之間的依賴也是很多,他們之家都是相互依賴。
下面主要看看各個類中的方法。本篇就當是Mina的文件了。一下總結來源於網路:
IoService
- 這個介面是服務端IoAcceptor、客戶端IoConnector 的抽象,提供IO 服務和管理IoSession的功能,它有如下幾個常用的方法:
+ <font color="blue">TransportMetadata getTransportMetadata()</font>: 這個方法獲取傳輸方式的元資料描述資訊,也就是底層到底基於什麼的實現,譬如:nio、apr 等。 + <font color="blue">void addListener(IoServiceListener listener)</font>: 這個方法可以為IoService 增加一個監聽器,用於監聽IoService 的建立、活動、失效、空閒、銷燬,具體可以參考IoServiceListener 介面中的方法,這為你參與IoService 的生命週期提供了機會。 + <font color="blue">void removeListener(IoServiceListener listener)</font>: 這個方法用於移除上面的方法新增的監聽器。 + <font color="blue">void setHandler(IoHandler handler)</font>: 這個方法用於向IoService 註冊IoHandler,同時有getHandler()方法獲取Handler。 + <font color="blue">Map<Long,IoSession> getManagedSessions()</font>: 這個方法獲取IoService 上管理的所有IoSession,Map 的key 是IoSession 的id。 + <font color="blue">IoSessionConfig getSessionConfig()</font>: 這個方法用於獲取IoSession 的配置物件,通過IoSessionConfig 物件可以設定Socket 連線的一些選項。
IoAcceptor
- IoAcceptor主要就是bind方法。之前文章已經介紹過了。這裡一帶而過
IoConnector
- 這個介面是TCPClient 的介面, 主要增加了ConnectFuture connect(SocketAddressremoteAddress,SocketAddress localAddress)方法,用於與Server 端建立連線,第二個引數如果不傳遞則使用本地的一個隨機埠訪問Server 端。這個方法是非同步執行的,同樣的,也可以同時連線多個服務端。
IoSession
這個介面用於表示Server 端與Client 端的連線,IoAcceptor.accept()的時候返回例項。
WriteFuture write(Object message)
用於非同步寫資料
CloseFuture close(boolean immediately)
這個方法用於關閉IoSession,該操作也是非同步的,引數指定true 表示立即關閉,否則就在所有的寫操作都flush 之後再關閉
Object setAttribute(Object key,Object value)
這個方法用於給我們向會話中新增一些屬性,這樣可以在會話過程中都可以使用,類似於HttpSession 的setAttrbute()方法。IoSession 內部使用同步的HashMap 儲存你新增的自
定義屬性。SocketAddress getRemoteAddress()
這個方法獲取遠端連線的套接字地址
void suspendWrite()
這個方法用於掛起寫操作,那麼有void resumeWrite()方法與之配對。對於read()方法同樣適用
ReadFuture read()
這個方法用於讀取資料, 但預設是不能使用的, 你需要呼叫IoSessionConfig 的setUseReadOperation(true)才可以使用這個非同步讀取的方法。一般我們不會用到這個方法,因為這個方法的內部實現是將資料儲存到一個BlockingQueue,假如是Server 端,因為大量的Client 端傳送的資料在Server 端都這麼讀取,那麼可能會導致記憶體洩漏,但對於Client,可能有的時候會比較便利
IoService getService()
這個方法返回與當前會話物件關聯的IoService 例項.關於TCP連線的關閉:無論在客戶端還是服務端,IoSession 都用於表示底層的一個TCP 連線,那麼你會發現無論是Server 端還是Client 端的IoSession 呼叫close()方法之後,TCP 連線雖然顯示關閉, 但主執行緒仍然在執行,也就是JVM 並未退出,這是因為IoSession 的close()僅僅是關閉了TCP的連線通道,並沒有關閉Server 端、Client 端的程式。你需要呼叫IoService 的dispose()方法停止Server 端、Client 端
IoSessionConfig
這個方法用於指定此次會話的配置,它有如下常用的方法
void setReadBufferSize(int size)
這個方法設定讀取緩衝的位元組數,但一般不需要呼叫這個方法,因為IoProcessor 會自動調整緩衝的大小。你可以呼叫setMinReadBufferSize()、setMaxReadBufferSize()方法,這樣無論IoProcessor 無論如何自動調整,都會在你指定的區間
void setIdleTime(IdleStatus status,int idleTime)
這個方法設定關聯在通道上的讀、寫或者是讀寫事件在指定時間內未發生,該通道就進入空閒狀態。一旦呼叫這個方法,則每隔idleTime 都會回撥過濾器、IoHandler 中的sessionIdle()方法
void setWriteTimeout(int time)
這個方法設定寫操作的超時時間
void setUseReadOperation(boolean useReadOperation)
這個方法設定IoSession 的read()方法是否可用,預設是false
IoHandler
這個介面是你編寫業務邏輯的地方,從上面的示例程式碼可以看出,讀取資料、傳送資料基本都在這個介面總完成,這個例項是繫結到IoService 上的,有且只有一個例項(沒有給一個IoService 注入一個IoHandler 例項會丟擲異常)。它有如下幾個方法
void sessionCreated(IoSession session)
這個方法當一個Session 物件被建立的時候被呼叫。對於TCP 連線來說,連線被接受的時候呼叫,但要注意此時TCP 連線並未建立,此方法僅代表字面含義,也就是連線的物件IoSession 被建立完畢的時候,回撥這個方法。對於UDP 來說,當有資料包收到的時候回撥這個方法,因為UDP 是無連線的
void sessionOpened(IoSession session)
這個方法在連線被開啟時呼叫,它總是在sessionCreated()方法之後被呼叫。對於TCP 來說,它是在連線被建立之後呼叫,你可以在這裡執行一些認證操作、傳送資料等。對於UDP 來說,這個方法與sessionCreated()沒什麼區別,但是緊跟其後執行。如果你每隔一段時間,傳送一些資料,那麼sessionCreated()方法只會在第一次呼叫,但是sessionOpened()方法每次都會呼叫
void sessionClosed(IoSession session)
對於TCP 來說,連線被關閉時,呼叫這個方法。對於UDP 來說,IoSession 的close()方法被呼叫時才會毀掉這個方法
void sessionIdle(IoSession session, IdleStatus status)
這個方法在IoSession 的通道進入空閒狀態時呼叫,對於UDP 協議來說,這個方法始終不會被呼叫
void exceptionCaught(IoSession session, Throwable cause)
這個方法在你的程式、Mina 自身出現異常時回撥,一般這裡是關閉IoSession
void messageReceived(IoSession session, Object message)
接收到訊息時呼叫的方法,也就是用於接收訊息的方法,一般情況下,message 是一個IoBuffer 類,如果你使用了協議編解碼器,那麼可以強制轉換為你需要的型別。通常我們都是會使用協議編解碼器的, 就像上面的例子, 因為協議編解碼器是TextLineCodecFactory,所以我們可以強制轉message 為String 型別
void messageSent(IoSession session, Object message)
當傳送訊息成功時呼叫這個方法,注意這裡的措辭,傳送成功之後,也就是說傳送訊息是不能用這個方法的。傳送訊息的時機:傳送訊息應該在sessionOpened()、messageReceived()方法中呼叫IoSession.write()方法完成。因為在sessionOpened()方法中,TCP 連線已經真正開啟,同樣的在messageReceived()方法TCP 連線也是開啟狀態,只不過兩者的時機不同。sessionOpened()方法是在TCP 連線建立之後,接收到資料之前傳送;messageReceived()方法是在接收到資料之後傳送,你可以完成依據收到的內容是什麼樣子,決定傳送什麼樣的資料。因為這個介面中的方法太多,因此通常使用介面卡模式IoHandlerAdapter,覆蓋你所感興趣的方法即可
IoBuffer
這個介面是對JAVA NIO 的ByteBuffer 的封裝,這主要是因為ByteBuffer 只提供了對基本資料型別的讀寫操作,沒有提供對字串等物件型別的讀寫方法,使用起來更為方便,另外,ByteBuffer 是定長的,如果想要可變,將很麻煩。IoBuffer 的可變長度的實現類似於StringBuffer。IoBuffer 與ByteBuffer 一樣,都是非執行緒安全的。本節的一些內容如果不清楚,可以參考java.nio.ByteBuffer 介面。這個介面有如下常用的方法
static IoBuffer allocate(int capacity,boolean useDirectBuffer)
這個方法內部通過SimpleBufferAllocator 建立一個例項,第一個引數指定初始化容量,第二個引數指定使用直接緩衝區還是JAVA 記憶體堆的快取區,預設為false
void free()
釋放緩衝區,以便被一些IoBufferAllocator 的實現重用,一般沒有必要呼叫這個方法,除非你想提升效能(但可能未必效果明顯)
IoBuffer setAutoExpand(boolean autoExpand)
這個方法設定IoBuffer 為自動擴充套件容量,也就是前面所說的長度可變,那麼可以看出長度可變這個特性預設是不開啟的
IoBuffer setAutoShrink(boolean autoShrink)
這個方法設定IoBuffer為自動收縮,這樣在compact()方法呼叫之後,可以裁減掉一些沒有使用的空間。如果這個方法沒有被呼叫或者設定為false,你也可以通過呼叫shrink()方法手動收縮空間
IoBuffer order(ByteOrder bo)
這個方法設定是Big Endian 還是Little Endian,JAVA 中預設是Big Endian,C++和其他語言一般是Little Endian
IoBuffer asReadOnlyBuffer()
這個方法設定IoBuffer 為只讀的
Boolean prefixedDataAvailable(int prefixLength,int maxDataLength)
這個方法用於資料的最開始的1、2、4 個位元組表示的是資料的長度的情況,prefixLentgh表示這段資料的前幾個位元組(只能是1、2、4 的其中一個),代表的是這段資料的長度,maxDataLength 表示最多要讀取的位元組數。返回結果依賴於等式remaining()-prefixLength>=maxDataLength,也就是總的資料-表示長度的位元組,剩下的位元組數要比打算讀取的位元組數大或者相等
String getPrefixedString(int prefixLength,CharsetDecoder decoder)
如果上面的方法返回true,那麼這個方法將開始讀取表示長度的位元組之後的資料,注意要保持這兩個方法的prefixLength 的值是一樣的。G、H兩個方法在後面講到的PrefixedStringDecoder 中的內部實現使用。IoBuffer 剩餘的方法與ByteBuffer 都是差不多的,額外增加了一些便利的操作方法,例如:IoBuffer putString(String value,CharsetEncoder encoder)可以方便的以指定的編碼方式儲存字串、InputStream asInputStream()方法從IoBuffer 剩餘的未讀的資料中轉為輸入流等
IoFuture
在Mina的很多操作中,你會看到返回值是XXXFuture,實際上他們都是IoFuture的子類,看到這樣的返回值,這個方法就說明是非同步執行的,主要的子類有ConnectFuture、CloseFuture 、ReadFuture 、WriteFuture 。這個介面的大部分操作都和java.util.concurrent.Future介面是類似的,譬如:await()、awaitUninterruptibly()等,一般我們常用awaitUninterruptibly()方法可以等待非同步執行的結果返回。這個介面有如下常用的方法
IoFuture addListener(IoFutureListener<?> listener)
這個方法用於新增一個監聽器, 在非同步執行的結果返回時監聽器中的回撥方法operationComplete(IoFuture future),也就是說,這是替代awaitUninterruptibly()方法另一種等待非同步執行結果的方法,它的好處是不會產生阻塞
IoFuture removeListener(IoFutureListener<?> listener)
這個方法用於移除指定的監聽器
IoSession getSession()
這個方法返回當前的IoSession。舉個例子,我們在客戶端呼叫connect()方法訪問Server 端的時候,實際上這就是一個非同步執行的方法,也就是呼叫connect()方法之後立即返回,執行下面的程式碼,而不管是否連線成功。那麼如果我想在連線成功之後執行一些事情(譬如:獲取連線成功後的IoSession物件),該怎麼辦呢?按照上面的說明,你有如下兩種辦法:
加入戰隊
# 加入戰隊
微信公眾號
主題
加入戰隊
# 加入戰隊
微信公眾號
相關推薦
Mina各元件介紹
Mina各元件介紹 上一篇文章已經系統的介紹了Mina的執行流程,Apache推出的Mina效能上很是高效,上章節我們知道內部有很多的類,各個類之間的依賴也是很多,他們之家都是相互依賴。 下面主要看看各個類中的方法。本篇就當是Mina的文件了。一下總結來源於網路: IoService 這個介面是服務端IoA
openstack各元件介紹
經常有朋友讓我介紹Openstack,我就乾脆寫一篇Openstack的元件介紹,也算是總結一下。馬上2012年就要結束了,也是到該總結的時候。去年現在的Openstack,其實官方的Keystone和Horizon還沒法很好的一起工作。 我個人的理解:下面的元件全部
vmware horizon 6.0搭建-(一、各元件的簡單介紹)
vmware horizon 6.0主要由以下幾個功能模組組成: 1.Microsoft Active Directory:對使用者進行身份驗證和管理。 2.Vmware Vcenter Server:對物理主機和虛擬機器進行管理。 3.Vmware Horizon view
EasyDarwin流媒體平臺各功能元件介紹
EasyDarwin單平臺部署 很多人一直分不清楚EasyDarwin團隊開發的一堆Easy開頭的專案各自都是幹什麼的,怎麼配合工作的。這裡做個簡單的介紹: EasyDarwin:開源RTSP流媒體伺服器。 EasyPusher是支援各種平臺的RTSP推流
畫畫一樣開發軟件 顯示元件介紹-總述
軟件開發;管理軟件開發;無代碼管理軟件無代碼開發顯示元件介紹-總述 開發工具中的顯示元件對應的是用戶前端設計部分,默認分為模板顯示元件和元件選項板中的顯示元件兩部分,第一部分是新建一個項目時自動生成的最底層的顯示塊,如我們新建時選新移動應用模板時,自動生成三個顯示塊:手機端顯示塊、平板端顯示塊和電腦端顯示塊:
TERSUS畫畫一樣開發軟件 顯示元件介紹-容器類顯示元件
軟件開發;管理軟件開發;無代碼軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中可拖放使用的容器類顯示元件包括:內容顯示塊(Pane)元件、行顯示元件(Row)、列顯示元件(Column)、工具欄元件(Tool bar)、組合元件(Group) 內容顯示塊(Pane)元件:是一個顯示容器,可以做為一個顯示
TERSUS畫畫一樣開發軟件 顯示元件介紹-按鈕類顯示元件
軟件開發;無代碼軟件開發;管理軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中可拖放使用的按鈕類顯示元件包括:按鈕(Button)元件、按鈕組(Button Group)元件。 按鈕(Button)元件:用戶在前端可以直接看到一個帶名稱的按鈕,點擊後可執行一個邏輯處理的元件,其默認的結構如下圖,是開發時
TERSUS畫畫一樣開發軟件 顯示元件介紹-圖片圖標類顯示元件
軟件開發 管理 軟件開發 TERSUS無代碼手機電腦管理類軟件開發,其中可拖放使用的圖片圖標類顯示元件包括:圖片顯示元件(Image)、通用顯示塊元件(HTML Tag)。 圖片顯示元件(Image):顯示圖片用,直接指定所要顯示的圖片的地址,在屬性中定義圖片樣式即可。 1、圖片源文件可以是項目文
TERSUS畫畫一樣開發軟件 顯示元件介紹-輸入框類顯示元件
軟件開發管理軟件無代碼軟件開發無代碼手機電腦管理類軟件開發,其中可拖放使用的輸入框類顯示元件包括:字符輸入框元件(Text Field)、多行文本輸入框元件(Text Area)、密碼輸入框元件(Password Field)、數字輸入框元件(Number Field)、日期輸入框元件(Date Field)
TERSUS畫畫一樣開發軟件 顯示元件介紹-勾選類顯示元件
軟件開發;管理軟件開發;無代碼軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中可拖放使用的勾選類顯示元件包括:勾選框元件(Check Box)、帶標簽勾選框元件(Check Box with label)、放射效果多選項按鈕元件(Radio Button Group)、放射效果單項勾選元件(Radio
TERSUS畫畫一樣開發軟件 顯示元件介紹-上傳顯示元件
軟件開發管理軟件無代碼軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中上傳類顯示元件包括:表單元件(Form)、文件上傳框元件(File Field) 表單元件(Form):是一個提交信息的元件,類似一個輸入框套嵌的容器,可以點右鍵添加4類帶標簽的輸入框元件,隨意添加多個,然後再定義各元件的顯示樣式即即
TERSUS畫畫一樣開發軟件 顯示元件介紹-常量及鏈接顯示元件
軟件開發管理軟件無代碼軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中包括務類常量顯示和鏈接顯示元件:字符顯示元件(Text Display)、數字顯示元件(Number Display)、日期顯示元件(Date Display)、時間顯示元件(Date and Time Display)、鏈接顯示元件
TERSUS畫畫一樣開發軟件 顯示元件介紹-列表顯示元件
軟件開發;管理軟件;無代碼軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中專用於手機或平板端的重復類信息顯示的元件:列表或清單元件(List) 列表或清單(List)元件:是一個容器類的元件,當有一組多個信息需要顯示在一塊區域且多組排列顯示時用。多用於手機和平板端。比如常用的應用中,手機查看店中上架的零
TERSUS畫畫一樣開發軟件 顯示元件介紹-子頁面及彈窗顯示元件
軟件開發;管理軟件;無代碼軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中窗口類顯示元件包括:子頁面元件(Page Dialog)、彈窗顯示元件(Modal Dialog) 子頁面元件(Page Dialog):是手機和平板移動端設計時所用到的新頁面元件,移動端是由各個頁面所組成的,在按鈕等元件中放置一
TERSUS畫畫一樣開發軟件 顯示元件介紹-表格顯示元件
無代碼件開發;管理軟件;軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中表格顯示元件包括:簡單表格顯示元件(Simple Table)、復雜表格顯示元件(Table) 簡單表格顯示元件(Simple Table):是一個簡單的二維固定樣式表格元件,其中只有一個顯示列的數據結構是可以變更的,默認有一個日期
TERSUS畫畫一樣開發軟件 顯示元件介紹-分頁面及左右欄顯示元件
軟件開發 管理 軟件開發 TERSUS無代碼手機電腦管理類軟件開發,其中頁面框架設計的顯示元件包括:分頁面顯示元件(Tabbed Pane)、左右可調大小兩欄顯示元件(Split Pane) 分頁面顯示元件(Tabbed Pane):是一個含多個顯示頁面的容器,每個頁面以一個橫放欄位的形式出現,默
TERSUS畫畫一樣開發軟件 顯示相關處理元件介紹-提示行為元件
軟件開發 無代碼 管理 TERSUS無代碼手機電腦管理類軟件開發,其中提示行為類元件包括:提示框(Alert)元件、確認信息框(Confirm)元件及退出提示框(Set Unload Confirmation)元件 提示框(Alert)元件:是用於在用戶前端界面彈出一個顯示框顯示一個提示信息,一般
TERSUS畫畫一樣開發軟件 顯示相關處理元件介紹-頁面行為元件1
軟件開發;管理軟件;無代碼軟件開發TERSUS無代碼手機電腦管理類軟件開發,其中頁面處理行為類元件包括:向前一頁(Forward)元件、後退(Back)元件、跳轉頁面(Go to URL)元件、帶參數的跳轉(Create Location)頁面地址生成元件、獲取頁面參數(Get View Parameters
TERSUS畫畫一樣開發軟件 顯示相關處理元件介紹-頁面行為元件2
軟件開發;管理軟件;無代碼軟件TERSUS無代碼手機電腦管理類軟件開發,其中頁面處理行為類元件還包括:關閉頁面(Close Window)元件、刷新頁面內容(Refresh)元件 關閉頁面(Close Window)元件:這個功能主要用於關閉當前打開的窗口或頁面,顯示前一個頁面,比如在彈窗元件中,右上角是一個
TERSUS畫畫一樣開發軟件 顯示相關處理元件介紹-對象的行為元件
軟件開發;管理軟件;無代碼軟件TERSUS無代碼手機電腦管理類軟件開發,其中對顯示對象的處理行為元件包括:定位光標(Focus)元件、刪除元件(Delete Element)元件、過程中的時間選取(Prompt Date)元件、獲取元件名稱(Get Element Name)元件、獲取父層對象(Get Par