java客户端通过TCP连接与c ++服务器通信

时间:2011-08-01 14:31:25

标签: java c++ networking

我是网络新手,所以希望我能够解释我的问题。

我的老板最近为我做了一个虚拟服务器来测试我的应用程序的网络,我遇到了关于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的新手:)

3 个答案:

答案 0 :(得分:1)

您可以准确传递老板测试程序所需的数据,而无需让老板对其进行修改。

在Java方面,您可以通过多种方法在C ++结构定义的布局中编写数据,包括: * java.io.DataOutputStream * java.nio.ByteBuffer和java.nio.channels.SocketChannel。

您可能会遇到字段对齐和字节顺序问题。 * C结构中的某些字段可能在填充后开始与字边界对齐。 * Java默认会写入网络字节顺序(big-endian)。在Java方面,ByteBuffer允许选择不同的顺序。

答案 1 :(得分:0)

欢迎来到SO。

至于你的问题,为什么像XML和JSON这样的消息传递格式如此受欢迎,他们解决了这样的问题。因为它是你将不得不与发送无符号的整数和担心字符编码和字符串的战斗。如果您无法更改服务器端的格式,我建议您查看ByteBuffer。你仍然需要做一些按摩,但至少它会缓解一些疼痛。

答案 2 :(得分:0)

安迪的回答是正确的。但是应该说你老板的程序需要重写。即使另一端用C语言编写,直接在网络上传递C结构也不是一个好主意。该技术依赖于以下两端相同的结构:

  1. 硬件字节顺序
  2. 编译器的填充和打包规则
  3. 周围的#pragmas
  4. 因此

    1. 编译器供应商
    2. 编译器版本
    3. 这个(不完整的)列表已经太久了,我们仍然只考虑C到C.