?? mina.txt
字號:
(一)IoSession
Session可以理解為服務器與客戶端的特定連接,該連接由服務器地址、端口以及客戶端地址、端口來決定。客戶端發起請求時,指定服務器地址和端口,客戶端也會指定或者根據網絡路由信息自動指定一個地址、自動分配一個端口。這個地址、端口對構成一個Session。
Session是服務器端對這種連接的抽象,MINA對其進行了封裝,定義了IoSession接口,用來代表客戶端與服務器的連接,在服務器端來指代客戶端,實現對客戶端的操作、綁定與客戶端有關的信息與對象。通過利用Session的這個概念,編寫程序時就可以在服務器端非常方便地區分出是當前處理的是哪個客戶端的請求、維持客戶端的狀態信息、可以實現客戶端之間相互通訊。
IoSession提供以下一些常用方法:
(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()中實現。
(二)IoHandler
對來自客戶端數據最終處理是在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方法,不用管其他方法。
(三)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通信過程。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -