2011-08-01 229 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

相关问题