java與C++ 的socket通信(1)

作者:李東龍  

        最近在做一個項目,java做的是門戶,後臺的具體實現要是用c++實現的。所以javaC++的通信自然不可或缺。

        我們的接口方式實現分爲兩種,一:webservice 二:基於tcp協議的socket通信。Webservicejava發佈接口,用C++來調用。Java調用c++是通過發送tcp協議。

        前天剛剛進行了接口聯調。基本搞定了,現在來總結一下:

        首先我們做socket通信用的是Apachemina,先來介紹一個這個mina

 

 1MINA框架簡介

         MINA(MultipurposeInfrastructure forNetwork Applications)是用於開發高性能和高可用性的網絡應用程序的基礎框架。通過使用MINA框架可以可以省下處理底層I/O和線程併發等複雜工作,開發人員能夠把更多的精力投入到業務設計和開發當中。MINA框架的應用比較廣泛,應用的開源項目有Apache DirectoryAsyncWebApache QpidQuickFIX/JOpenfireSubEthaSTMPred5等。MINA框架當前穩定版本是1.1.6,最新的2.0版本目前已經發布了M1版本。

        MINA框架的特點有:基於java NIO類庫開發;採用非阻塞方式的異步傳輸;事件驅動;支持批量數據傳輸;支持TCPUDP協議;控制反轉的設計模式(支持Spring);採用優雅的鬆耦合架構;可靈活的加載過濾器機制;單元測試更容易實現;可自定義線程的數量,以提高運行於多處理器上的性能;採用回調的方式完成調用,線程的使用更容易。

 

2MINA框架的常用類

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的如何創建長連接還在研究中……

             







未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章