簡體   English   中英

Java客戶端通過TCP連接與C ++服務器通信

[英]java client talking to c++ server through TCP connection

我是網絡新手,所以希望我能夠解釋我的問題。

我的老板最近為我制作了一個虛擬服務器來測試我的應用程序的網絡,我遇到了從Java到C ++的問題。 他的服務器是用c ++編寫的,運行時它等待並偵聽名為“ RemoteMsgStruct”的特定c ++數據結構:

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

問題在於我的程序是用Java編寫的。 我將如何通過Java傳遞類似的消息以供服務器處理?

提前感謝您的幫助。 如果沒有充分解釋或遺漏,請告訴我。 就像我說的,我是網絡和stackoverflow的新手:)

您可以准確傳遞老板測試程序所期望的數據,而無需您的老板對其進行修改。

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

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

歡迎來到SO。

關於您的問題,有一個原因使得XML和JSON之類的消息傳遞格式如此流行,它們可以解決此類問題。 這樣一來,您將不得不與發送未簽名的int並擔心字符編碼和字節序有關。 如果您不能在服務器端更改格式,那么我建議您看一下ByteBuffer 您仍然需要做一些按摩,但是至少可以減輕一些痛苦。

安迪的答案是正確的。 但是應該說您老板的程序需要重寫。 即使另一端用C編寫,直接通過網絡傳遞C結構也絕不是一個好主意。該技術依賴於兩端的以下相同之處:

  1. 硬件字節順序
  2. 編譯器的填充和打包規則
  3. 周圍的#pragmas

因此

  1. 編譯器供應商
  2. 編譯器版本

這個(不完整的)列表已經太長了,我們仍然只考慮C到C。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM