實在無聊,考慮把當前應用的通訊模式由http移植為socket, 服務器這塊因為對NIO并不熟悉,所以考慮使用現成的網絡通訊框架進行移植,花了點時間測試比較流行的mina和xsocket。 == 相同點 == 1. 都對nio進行了有效屏蔽, 可以簡化開發過程, 對于文本流模式的應用,兩者都非常簡單,實現一個基本的handle就可以 2. 提供了一些常見的輔助功能,比如日志等, mina支持更全面一些 3. 可以通過綁定各種附加屬性實現基于會話的工作方式,會話控制都提供了完整的支持 4. 理論上都可以提供lowerlevel數據的處理支持, 不過實際操作, mina比較復雜,文檔也缺失。 5. 都提供了客戶端使用包,簡化客戶端開發 6. 都提供了jmx的集成支持,可以通過第三方工具來監控使用狀況 == 差異 == 兩者設計的出發點不同, xsocket是一個輕量級的解決方案,核心思想是屏蔽,簡化nio方式的的開發,并不需要過多的學習。 Mina的目的在我看來更多的是提供一個服務器開發的基礎平臺,相對來說提供的支持要全面,也復雜的多, 如果缺少對java nio框架的深入理解, 對mina的一些特性就難以利用。 對數據的處理,xsocket的出發點是通過提供對基本類型的支持來做到簡單靈活的操作, 而mina則希望在更高的層面上即通過自定義的協議擴展來屏蔽掉應用對數據的處理操作,把核心放置到業務處理邏輯上。
做一個簡單比較如下
* xscoket把對文本的支持做為基本屬性,并且提供了Delimiter這樣的支持,相比mina要好用一些。而對于解析http中mulitpart這樣的文本二進制混合的結構,顯然要比mina 好使。
*mina 要較好的使用需要對nio有深入的了解, 一般使用學習難度不大 * xsocket 基本不用學習 == 結論 ==
我的應用是手機和服務器端通過自定義的二進制協議進行通訊,我需要的是一個輕量級的解決方案。 使用mina的自定義協議方式處理需要額外的工作量, 而mina對直接操作基本數據類型的支持并不好,或者說需要我深入的學習nio部分內容。 最終因為fragment和對lowerlevel數據的更簡單的支持讓我選擇了xsocket,很輕松的完成了移植工作。 如果一開始設計通訊部分就接觸mina的話,我可能會堅持使用mina的自定義協議方式來處理,但是就目前來說,他太復雜了,將來有時間,可以做為應用模式的學習對mina進行深入解剖。
== 其他 == 其他常見的java的通訊協議框架 qickeserver : 以文本流為模式的通訊框架 netty: mina的前身 cindy: 國人在接觸netty之后開發的, 我接觸時已經停止開發一年了,所以基本不予考慮。
== 補充 == 下午無聊又玩了一下quick server。 1. quickserver 1.4.7 現在有提供對binary模式的支持,可以使用一個ClientBinaryHandle處理二進制流,不過處理稍顯復雜,還要多開一個線程。對當前的應用來說xsocket已經足夠了。 2. quickserver 在易用性和復雜程度方面在xsocket和mina之間, 架構上更傾向于解決較復雜的問題,和mina有很多相似處。 較復雜的數據處理也需要引入流和bytebuffer的概念。 3. quick的文檔和例子都不錯, 要明顯比mina好, 有點不爽的是配置文件有點婆媽,考慮到我的一般應用都是要集成到服務器中使用的,覺得有點煩,不過基本可以放棄研究mina了。 4. quick 架構上handle的使用可以配置,產生類似mina那種filter的效果,還是蠻有意思的。 5. 另外還自己實現了一些婆婆媽媽的管理界面,有空看看完。 最后許可證協議只要使用binary的包,商用就沒問題。 其實這3個框架都是以回調和組裝為中心的設計,關注點有所不同而已。自己比較懶還是喜歡那種越簡單越好的,看mina有點頭疼。