Apache MINA 應用高階

2021-06-20 11:10:07 字數 3270 閱讀 7522

1。mina 框架簡介

下圖為本人根據對mina的簡要理解,所畫出來的框架簡圖:

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通訊過程。

Apache MINA 應用高階

li.zhongnan hotmail.com 1。mina 框架簡介 下圖為本人根據對mina的簡要理解,所畫出來的框架簡圖 session可以理解為伺服器與客戶端的特定連線,該連線由伺服器位址 埠以及客戶端位址 埠來決定。客戶端發起請求時,指定伺服器位址和埠,客戶端也會指定或者根據網路路由資訊自...

Apache Mina 基礎入門

1.需要niosocketacceptor 2.設定編碼解碼過濾器 3.設定一些session的屬性 4.繫結乙個埠 public class minaserver catch ioexception e public class myserverhandler extends iohandlera...

Apache MINA框架簡述

1。mina 框架簡介 下圖為本人根據對mina的簡要理解,所畫出來的框架簡圖 session可以理解為伺服器與客戶端的特定連線,該連線由伺服器位址 埠以及客戶端位址 埠來決定。客戶端發起請求時,指定伺服器位址和埠,客戶端也會指定或者根據網路路由資訊自動指定乙個位址 自動分配乙個埠。這個位址 埠對構...