要开始了,我很新与sockects和TCP / IP数据包的网络,我将不胜感激,如果你能在一个非常清晰的方式解释。 我的机器人程序试图使用Kinect的以我们现在的机器人第一次,但我们有一个问题。 在Java中目前他们的代码,而他们计划在编码C ++ Kinect的。 是否有可能使用TCP / IP数据包发送两种语言之间的信息? 我们需要一个C ++客户端和Java服务器。 如果任何人有联系或例子我将不胜感激,谢谢!
Answer 1:
Java和C / C ++之间通信的实际问题是字节顺序问题。 如果将要发送的二进制数据,必须清楚,完整地设计通信结构,包括多种尺寸(以字节为单位),位阶(LSB / MSB,交换字节或短,整数非交换的字节,并且多头),和结构填料(在结构中的填充字节字段之间的数)。
我建议你不要在二进制沟通,如果你能避免它。 有两个原因;
- 无担心的位阶,字节交换和结构的包装。
- 在该通信窃听,而不对数据进行解码。 你还有ASCII / Unicode的问题在这里。
EDIT在C / C ++,数据被存储在的方式,使CPU访问快速和容易。 一类/结构的字段在字边界对齐(因为大部分的CPU只能访问完整的字块内存),以及位奉命CPU相匹配。 但是,CPU的可以有不同的比特订单和字的长度(16,32,64,......)。 大多数英特尔CPU的都是小端,和大多数其他设计是大端。 为了让生活更有趣,Java虚拟机是每一个平台上大端。 http://en.wikipedia.org/wiki/Endianness
所以,如果你想要两个C / C ++的机器要能沟通,那么你必须以一种既可以读取它发送数据。 通常情况下,在异构环境(称为“过线”)进行通信您指定的所有通信都以特定的格式来完成。 TCP / IP使用MSB(最显著位)排序。 所有的程序,然后来翻译(如有必要)从有线格式。
由于CPU的字长块消耗内存,那么编译器把不补整机字字段之间垫字节。 用于机器读取32个字,这样的结构:
struct example1 {
char someFlag;
int someCount;
};
实际上采取8个字节的内存。 第一字段由数据和3填充字节一个字节的,使得整数参考在字边界上对齐。 如果幼稚通信尝试在该结构中发送数据,说send(&example1, sizeof(example1));
用不同的字大小或字节排序,其中其他系统不另一个系统read(&example1, sizeof(example1));
,然后example1.someCount的价值可能会非常不同的预期。
这其中大部分直到你把Java的进入是正常的学术。 因为Java总是MSB格式。 所以,从C / C ++应用程序的Java应用程序发送,即使在相同的硬件,可能会导致此相同的意想不到的结果。
Java的包含我最喜欢的I / O类java.nio.ByteBuffer
。 它从几乎任何源读取的int,long花车,和双打的能力。 如果你知道数据如何被创造了,这会读它。 字节缓冲区具有getShort
, getInt
等方法来获得任何类型,以及一个order()
方法来设置数据的字节顺序。
Answer 2:
每当你想两个程序在网络上互相交谈,你需要定义一个协议 。
在TCP上定义的协议需要指定一个方法来告诉接收器已经接收到整个消息时。 两种常见的方法来做到这一点是:
- 指定信号“结束”数据的一些特殊序列。 一个例子是HTTP,其利用一个特殊字符CRLF的用信号通知消息的非有效载荷部分的结束。
- 指定该消息的一些预定的部分的消息的长度。 一个例子是HTTP,其指定在“内容长度”报头中的有效载荷的长度。
你可以在这里找到关于HTTP报文结构的详细信息: http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html
而且你可能会喜欢编码有效载荷的平台无关的格式。 一个好的二进制格式是谷歌的协议缓冲区这是在Java和C ++的支持非常好: http://code.google.com/p/protobuf/
Answer 3:
当然,你可以交换信息的程序,来实现不同的语言。 (你有没有想到,整个互联网使用Java?)
这里是我谷歌搜索“socket编程{Java和C ++}”后发现:
http://codebase.eu/tutorial/linux-socket-programming-c/ -似乎是OK
http://www.javaworld.com/jw-12-1996/jw-12-sockets.html - Java教程
不过要小心。 根据您的硬件体系结构可能会交换二进制数据(字节顺序等)时遇到了一些问题。 当您使用面向对象的语言,你可以考虑使用某种中间件负责处理低级通信-例如冰 。 然而,这可能是你的情况矫枉过正。