Cindy簡介
(作者Blog: http://spaces.msn.com/members/crmky)
Cindy是一個基于java nio的I/O框架,支持TCP/UDP單播/UDP多播/Pipe,為應(yīng)用程序提供了一個統(tǒng)一的接口去實現(xiàn)異步和同步的網(wǎng)絡(luò)操作。
java io包提供了一個簡單的模型去處理網(wǎng)絡(luò)流,它讀寫均為阻塞操作,在一般的應(yīng)用里,用戶總是開啟一個獨立線程或一個線程池去處理這些IO操作。它非常簡單易用,但在擴展性和效率上存在著一些問題。如果用戶只需要一兩個網(wǎng)絡(luò)連接,開啟幾個獨立線程操作無傷大雅,但是如果面對服務(wù)器端的成百上千個連接,采用java io提供的機制,就需要同時開啟成百上千個線程,即使能夠處理過來,花在線程上下文切換的時間也遠(yuǎn)遠(yuǎn)多于網(wǎng)絡(luò)操作的用時。
在JDK 1.4中,Java引入了nio包,除開nio提供的一些其他功能外,最吸引人的就是引入了非阻塞IO的實現(xiàn)。但是直接使用nio中非阻塞I/O需要處理眾多異常,維護狀態(tài),為應(yīng)用帶來不必要的復(fù)雜性。并且JDK 1.4中的nio包只實現(xiàn)了普通TCP/UDP單播/Pipe,JDK 5.0中引入了SSLEngine類,使得基于非阻塞I/O的TCP可以支持SSL和TLS,未來在JDK 6.0才會加入對非阻塞I/O UDP多播的實現(xiàn)。如果應(yīng)用程序只想使用同一個模型去操作網(wǎng)絡(luò)I/O,而不想關(guān)心這些諸多限制,那么Cindy是一個很好的選擇。
目前基于nio的開源I/O框架很多,Cindy并不是唯一的選擇,比較好實現(xiàn)如Netty2、MINA等等。由于是Cindy的作者,對Cindy的了解程度要高于對其他框架的了解程度,這里所做的比較只是基于作者自身的看法,可能會有失偏頗。在你進(jìn)行選擇之前,你應(yīng)該從你自身應(yīng)用的角度進(jìn)行仔細(xì)的比較。
Netty2具有很好的構(gòu)架,并且該框架非常有名,使用該框架的項目不少,這意味著開發(fā)團隊持續(xù)更新的動力非常大(BTW,剛知道Netty2的開發(fā)已經(jīng)停止了,抱歉)。同時Netty2的文檔非常齊全,并且支持JMX(這是我不熟悉的領(lǐng)域,不做評論)。Netty2的缺點就是實現(xiàn)代碼的質(zhì)量不是非常好,最大的缺點就是只支持普通的TCP。
MINA是Netty2作者的一個新項目,該項目目前實現(xiàn)的版本已經(jīng)支持TCP/UDP/Pipe,并且由它的Roadmap上可得知將來會加入對JMX和容器的支持。我未曾使用過該項目,不過既然是Netty2作者的新項目,應(yīng)該也吸收了Netty2的優(yōu)點,并且對Netty2中的缺點做了改良。從該項目帶的Example來看,使用起來應(yīng)該是非常簡單的。
Cindy起源于Netty2之后,借鑒了Netty2中MessageRecognizer類的設(shè)計,在當(dāng)前的版本中已經(jīng)全面支持普通TCP/Secure TCP/UDP單播/UDP多播/Pipe,可以使用同一個模型進(jìn)行同步/異步IO處理,并且成功的應(yīng)用在JML項目中(Java Msn Messenger Library,開源項目,目前發(fā)布的版本基于Cindy老的版本),并且在目前公司的項目中也有實際使用。Cindy目前并不打算加入對JMX的支持(不熟悉),也沒有計劃加入對容器的支持(這個應(yīng)該是應(yīng)用做的事情),我想保持Cindy核心的簡潔和高效,最好能夠代替Socket/DatagramSocket的地位(簡單應(yīng)用的話也許還是使用這個更好:))。Cindy目前缺點是文檔相對較少以及應(yīng)用的項目比較少,希望這幾篇文檔能夠稍微彌補以下Cindy在這文檔方面的不足。
Cindy:http://cindy.sourceforge.net
Netty2:http://gleamynode.net/dev/
MINA:http://www.apache.org/~trustin/mina-20050207/index.html