MINA 框架簡介

2022-05-13 15:05:11 字數 3171 閱讀 3639

1。mina 框架簡介

2。iosession

session可以理解為伺服器與客戶端的特定連線,該連線由伺服器位址、埠以及客戶端位址、埠來決定。客戶端發起請求時,指定伺服器位址和埠,客戶端也會指定或者根據網路路由資訊自動指定乙個位址、自動分配乙個埠。這個位址、埠對構成乙個session。

session是伺服器端對這種連線的抽象,mina對其進行了封裝,定義了iosession介面,用來代表客戶端與伺服器的連線,在伺服器端來指代客戶端,實現對客戶端的操作、繫結與客戶端有關的資訊與物件。通過利用session的這個概念,編寫程式時就可以在伺服器端非常方便地區分出是當前處理的是哪個客戶端的請求、維持客戶端的狀態資訊、可以實現客戶端之間相互通訊。

(1)setattribute(object key, object value)     getattribute(object key)

設定/獲取使用者定義的屬性。

將該屬性與session聯絡起來,方便以後處理使用者請求時使用。比如,如果要求使用者登入後才能繼續進行操作,那麼在使用者成功登陸後,可以通過 setattribute()設定乙個屬性,當使用者以後繼續請求時,可以通過getattribute()獲取該屬性來判斷使用者是否登入。

(2)getremoteaddress()

獲取遠端客戶端位址。

(3)getid()   getcreationtime()   getlastiotime()   getconfig()

獲取session的id、建立時間、上次io時間、配置資訊。

(4)write(object message)

將資料傳送給客戶端。

(5)close()

關閉session。

說明:可以在session中傳送資料,但是session沒有提供讀取資料的方法,讀取資料通過另一套機制在iohandler的messagereceived()中實現。

3。event

資料通訊一般包括資料的傳送和接收,由於在通訊過程中,可能要多次傳送和接收資料,以進行不同的業務互動。

不可能一直都接收和傳送資料,因此就有idle出現,在mina中,如果在設定的時間內沒有資料傳送或接收,那麼就會觸發乙個idle事件。

由於某種原因,可能會發生錯誤,導致系統異常發生,引發exception。

因此,如果從事件發生的角度看的話,就可以在mina中將通訊看成由乙個建立鏈結(sessioncreated 和 sessionopened )、多個資料接收和傳送、乙個關閉連線事件以及多個idle事件等7種事件組成的過程。

session是對雙方相互通訊的抽象,因此通訊的過程就是一系列與session相關的事件。

在mina現在對tcp的實現中,sessioncreated 和 sessionopened 沒有區別。因此嚴格來說,有6種型別的事件。

4。iohandler

從以上mina框架簡圖可以看出,對來自客戶端資料最終處理是在iohandler中處理的。iohandler封裝了來自客戶端不同事件的處理,如果對某個事件感興趣,可以實現相應的方法,當該事件發生時,iohandler中的方法就會被觸發執行。iohandler總共有7個方法對應7個事件:

(1)void exceptioncaught(iosession session, throwable cause)

有異常發生時被觸發。

(2)void messagereceived(iosession session, object message)

有訊息到達時被觸發,message代表接收到的訊息。

(3)void messagesent(iosession session, object message)

傳送訊息時時被觸發,即在呼叫iosession.write()時被觸發,message代表將要傳送的訊息。

(4)void sessionclosed(iosession session)

當連線關閉時被觸發,即session終止時被觸發。

(5)void sessioncreated(iosession session)

當建立乙個新連線時被觸發,即當開始乙個新的session時被觸發。

(6)void sessionidle(iosession session, idlestatus status)

當連線空閒時被觸發。使用iosessionconfig中的setidletime(idlestatus status, int idletime)方法可以設定session的空閒時間。如果該session的空閒時間超過設定的值,該方法被觸發,可以通過 session.getidlecount(status)來獲取sessionidle被觸發的次數。

(7)void sessionopened(iosession session)  

當開啟乙個連線時被觸發。在目前的實現中,好像 sessionopened 和 sessioncreated 沒有太大區別,sessioncreated 在 sessionopened 之前被觸發。

iohandler是乙個介面,一般情況沒有必要直接實現該介面的每乙個方法。mina提供了乙個iohandleradapter類,該類實現了iohandler要求的方法,但是都沒有做任何處理。當我們要編寫自己的handler時,可以擴充套件iohandleradapter,重寫我們關心的事件方法即可。比如,一般情況,我們比較關心是否接收到資料這個時間,那麼我們就可以覆蓋messagereceived方法,不用管其他方法。

5。iofilter

iofilter用來對客戶的請求或傳送給客戶的資料進行filter。與iohandler一樣,filter也是基於事件的,通過實現iofilter介面,就可以對通訊過程中的session的事件進行處理。

filter是一種鏈式結構,與iohandler不同,處理每一種session事件的函式中,除了傳入session物件外,還傳入了 nextfilter物件,用來代表下乙個filter。一般情況,在處理結束後,呼叫下乙個filter的相應方法作進一步處理。filter也可以針 對特定的通訊或資料,不進行進一步處理,就可以不用呼叫nextfilter的相應方法。

除了與session相應的7種事件外,在iofilter中還可以對filter的init、destroy以及add、remove等時間愛女作出處理。

mina提供了乙個iofilteradapter類,我們要編寫自己的filter時,可以擴充套件iofilteradapter,不用直接實現iofilter介面。

apache mina提供乙個loggingfilter類,用來log通訊過程。

Mina框架研究(3)

不堪回首 junotes filters iofilter 是mina框架中乙個核心的部分,如下圖,對間於ioservice和iohandle之間,用於過濾所有的i o事件和請求,其扮演的角色就像j2ee中的servlet。mina提供不少現成的過濾器 1 loggingfilter 日誌過濾器,用...

MINA 框架之IoService學習

在mina框架結構中我們知道,ioservice是mina應用程式的其中一層。它為server和client提供所有的io 服務。它處理你的應用程式和遠端對端的所有互動。其本身是乙個介面,在server端的實現為ioacceptor 在client端的實現為ioconnector 先來看看它的min...

Mina框架資料傳送流程

mina框架經常用,但是具體的細節還是摸不清楚。稍稍深入了一下 看了一下資料流程,在此做一些記錄。先看一下大致的流程。詳細的說明網上很多,比如官方 部分層的細節也沒有深究。主要看了一下iofilter 資料報傳送流程 session.write 這個函式應該是filter之前的業務。eclipse單...