作者:李東龍
最近在做一個項目,java做的是門戶,後臺的具體實現要是用c++實現的。所以java和C++的通信自然不可或缺。
我們的接口方式實現分爲兩種,一:webservice 二:基於tcp協議的socket通信。Webservice是java發佈接口,用C++來調用。Java調用c++是通過發送tcp協議。
前天剛剛進行了接口聯調。基本搞定了,現在來總結一下:
首先我們做socket通信用的是Apache的mina,先來介紹一個這個mina。
1.MINA框架簡介
MINA(MultipurposeInfrastructure forNetwork Applications)是用於開發高性能和高可用性的網絡應用程序的基礎框架。通過使用MINA框架可以可以省下處理底層I/O和線程併發等複雜工作,開發人員能夠把更多的精力投入到業務設計和開發當中。MINA框架的應用比較廣泛,應用的開源項目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架當前穩定版本是1.1.6,最新的2.0版本目前已經發布了M1版本。
MINA框架的特點有:基於java NIO類庫開發;採用非阻塞方式的異步傳輸;事件驅動;支持批量數據傳輸;支持TCP、UDP協議;控制反轉的設計模式(支持Spring);採用優雅的鬆耦合架構;可靈活的加載過濾器機制;單元測試更容易實現;可自定義線程的數量,以提高運行於多處理器上的性能;採用回調的方式完成調用,線程的使用更容易。
2.MINA框架的常用類
類NioSocketAcceptor用於創建服務端監聽;
類NioSocketConnector用於創建客戶端連接;
類IoSession用來保存會話屬性和發送消息;
類IoHandlerAdapter用於定義業務邏輯,常用的方法有:
方法定義
sessionCreated()當會話創建時被觸發
sessionOpened()當會話開始時被觸發
sessionClosed()當會話關閉時被觸發
sessionIdle()當會話空閒時被觸發
exceptionCaught()當接口中其他方法拋出異常未被捕獲時觸發此方法
messageRecieved()當接收到消息後被觸發
messageSent()當發送消息後被觸發
3. socket通信的常見問題
通過調試和開發過程中,大概遇到了兩種問題
【1】數據類型問題
由於C++和java本身的數據類型有些差異,所以在傳遞時會存在問題。 從java端發出的數據類型到C++解釋時出現不能識別的問題。
在網絡編程中,大家都要在發送時將類型轉換成網絡類型(一種中間的數據類型),這樣就可以解決數據類型的問題。隨後我會給出一些轉成網絡的方法。由於最近接口還有寫問題需要解決。
在轉成網絡類型之後,java發送默認發送的是Ascii碼,這樣對C++解析器報文來還需要進行轉換,並且接口長度不容易控制。所以在轉成網絡類型之後最好再轉成流的形式發送,這樣C++接起來更容易一些。
【2】長連接問題
由於該系統的設計原因,我們與C++通信需要建立長連接,什麼是長連接呢?
一般連接發送消息都是先建立連接(我們之前接觸過的握手協議),然後發送消息。發送結束之後就可以關閉連接了!長連接就是要,一直保持該連接的一直暢通,隨時可以發送消息。詢問了一下C++的開發人員,他們一般都是用心跳包保持連接的,意思就是每隔一段時間發送一個消息,確定一下連接是否還存在。如果不存在再建立一個。
現在java的如何創建長連接還在研究中……
未完待續