2011-08-01 84 views
0

我是新來的網絡,希望我能解釋我的問題。java客戶端通過TCP連接與C++服務器通信

我的老闆最近爲我測試了我的應用程序的網絡,並且遇到了關於java到C++的問題。他的服務器是用C++編寫並運行時,它會等待並偵聽特定的C++數據結構命名爲「RemoteMsgStruct」要傳遞:

typedef struct 
{ 
unsigned int Length; 
unsigned int BoardType; 
unsigned int MsgType; 
unsigned char Msg[MAX_MSG_SIZE]; 
} RemoteMsgStruct; 

的問題在於,我的計劃是用Java編寫的事實。我將如何去通過java傳遞類似的消息來處理服務器?

非常感謝您的幫助。如果有什麼解釋不夠好或似乎錯過讓我知道。就像我說的,我是新來的網絡和計算器:)

+0

你需要看看從TCP套接字數據是如何正在被插座處理。您在應用程序中編碼數據的方式也必須在服務器端進行解碼。因此,首先要解決一個協議,並繼續使用任何編碼解碼技術。例如原始字節格式/ XML/JSON /協議緩衝區等 – Arunmu

+0

@Juan EBOSSHASNOCLUE – Alnitak

回答

0

歡迎來到SO。

至於你的問題,爲什麼XML和JSON等消息格式如此受歡迎,他們解決這樣的問題是有原因的。因爲你必須通過發送未簽名的整數來進行爭奪,並擔心字符編碼和字節順序。如果你不能改變服務器端的格式,那麼我建議你看看ByteBuffer。你仍然需要做一些按摩,但至少可以緩解一些痛苦。

1

您可以準確地傳遞您的老闆的測試程序所期望的數據,而不要求您的老闆修改它。

在Java端,可以通過幾種方法中寫入由C++結構定義的佈局的數據,包括: * java.io.DataOutputStream中 * java.nio.ByteBuffer中和java.nio.channels.SocketChannel中。

您可能會遇到字段對齊和字節順序的問題。 * C結構中的某些字段可能在填充後開始與字邊界對齊。 *默認情況下,Java將編寫網絡字節順序(big-endian)。在Java方面,ByteBuffer允許選擇不同的順序。

0

Andy的回答是正確的。但應該說你的老闆的計劃需要重寫。通過網絡直接傳遞C結構是從來沒有的時候,另一端是用C寫這種技術依賴於以下是相同的兩端是個好主意:

  1. 硬件字節順序
  2. 編譯器的填充包裝規則
  3. 周圍編譯指示

因此

  1. 的編譯R銷售商
  2. 編譯器版本

這(不完全統計)名單實在太長已經和我們仍然只考慮C至C.

+0

鑑於我們掌握的信息有限,「需要重寫」是相當強大的。請注意,#1可以通過ntohl尋址等#2 /#3是重要的,如果多個編譯器將是一個要求。 –

+0

@Andy Thomas-Cramer我不同意。我認爲它不夠強大*這種事情將以最強烈的措辭被棄用。 Wire協議應該獨立於主機語言來定義,並且此線程足以證明。 – EJP

相關問題