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的編譯器與執行器很好的隔離...