openfire 7 底層框架介紹 mina

2021-09-01 16:29:08 字數 3055 閱讀 8535

openfire和客戶端之間的通訊,主要使用了阿帕奇的mina框架,mina主要基於jdk的nio,做了很多的封裝,開發者不必關心底層網路,mina為你完成了這些,你只需將你的精力集中在業務層。

openfire中使用mina的版本比較低,好像是1.7版本,現在最新的版本是2.0.7,下面就以最新版本2.0.7做簡單介紹。

niosocketacceptor acceptor = new niosocketacceptor(); ---這個就是開啟乙個socket的伺服器

acceptor.bind(new inetsocketaddress(18567));--繫結位址

acceptor.getfilterchain().addlast("log1", new loggingfilter(getclass()));--增加***

acceptor.sethandler(iohandleradapter);--設定訊息處理類

iohandleradapter是乙個抽象類,實現的iohandler介面。

iohandler:

public abstract inte***ce iohandler

public abstract void sessioncreated(iosession paramiosession)

throws exception;

public abstract void sessionopened(iosession paramiosession)

throws exception;

public abstract void sessionclosed(iosession paramiosession)

throws exception;

public abstract void sessionidle(iosession paramiosession, idlestatus paramidlestatus)

throws exception;

public abstract void exceptioncaught(iosession paramiosession, throwable paramthrowable)

throws exception;

public abstract void messagereceived(iosession paramiosession, object paramobject)

throws exception;

public abstract void messagesent(iosession paramiosession, object paramobject)

throws exception;

其執行流層是:

1.當客戶端和服務端建立乙個連線,會呼叫sessioncreated;

2.客戶端向服務端傳送資料,會呼叫sessionopened------>messagereceived;

3.客戶端和伺服器之間的資料在messagereceived中獲取。

socketsessionconfig scfg = acceptor.getsessionconfig();

cfg.setidletime(idlestatus.both_idle, 10);當10s鐘沒有進行讀寫操作就會呼叫sessionidle方法。

idlestatus有3個型別:reader_idle,writer_idle,both_idle。reader_idle為讀的空閒型別;

writer_idle,寫的空閒型別,

both_idle讀寫的空閒型別

在這個方法中,可以做檢測服務端和客戶端之間的連線是否中斷,如果中斷就做相關處理,比如把這個回話移除會話列表中。

5.當服務端要向客戶端傳送資料的時候,會呼叫messagesent。如服務端呼叫session.write(object o);的時候,會呼叫此方法。

6.當客戶端和服務端通訊異常的時候,會呼叫exceptioncaught。這個地方一般需要做處理,比如關閉當前會話。

7.當關閉會話的時候會呼叫sessionclosed方法。一般在這個地方將會話列表中的會話移除。

mina為我們已經提供了很多的***,比如日誌的:loggingfilter,比如處理文字的:

dc.addlast("dec", new protocolcodecfilter(new textlinecodecfactory(

charset.forname("utf-8"))));

這個將設定編碼方式。

在 org.apache.mina.filter包中可以看到很多已經實現的過濾器。

對於過濾器自己實現。

實現介面protocolcodecfactory,在這個介面中需要顯示加解碼,加解碼需要實現相關的介面protocoldecoder,protocolencoder。

對於mina提供了傳送物件的過濾器,如objectserializationcodecfactory,相關物件需要序列化。

在通訊中往往要設定自己的通訊報文格式,現有的比較成熟的是xmpp提供的即時通訊技術中就有相關介紹。

下面介紹客戶端方面的:

ioconnector connector=new niosocketconnector();--建立乙個connection

socketsessionconfig dcfg = (socketsessionconfig) this.connector.getsessionconfig();--獲取會話配置

connectfuture connfuture = this.connector.connect(new inetsocketaddress("localhost", 18567));--設定連線位址和埠

connfuture.awaituninterruptibly();--等待建立連線

session = connfuture.getsession();--獲取會話。

connector.sethandler(iohandler o);客戶端的iohandler

和服務端的一樣,在此就可以做和服務端的連線操作了。

只是對mina做了簡單的介紹,更多請查閱其他資料。

****(qq):851392159

出處:

PHP7陣列底層原理

php底層是由hashtable bucket實現 hashtable typedef struct hashtable bucket typedef struct bucketbucket 二 儲存過程 通過hash函式對key做hash,算出在中間表的下標,資料順序的儲存在bucket陣列 鍊錶...

7 選擇框 單選 多選 下拉框

wd.get 常見的選擇框包括 radio框 checkbox框 select框 找到對應元件,用click方法即可 element2 wd.find element by css selector s radio input value 小雷老師 element2.click print 當前選中...

php7與php5底層區別

php7之前的版本,直接將php 在語法解析階段生成zendvm指令,編譯器和執行器是耦合在一起的,所以如果語法規則或執行引擎有乙個變,則另外乙個也要跟著改變才可以。php7增加了抽象語法樹,首先將php 解析生成抽象語法樹,然後將抽象語法樹編譯為zendvm指令,將php的編譯器與執行器很好的隔離...