我有一个套接字,其中服务器在JAVA中,但客户端在C++中。通过使用JAVA和C++的套接字发送struct
Struct{
float length;
char[] name;
}myStruct;
我怎么可以转换结构,通过服务器发送的,并且可以通过客户端正确解析字节流?任何示例代码都会有帮助! (我听说XML是一个选项,但我不熟悉它)谢谢。
我有一个套接字,其中服务器在JAVA中,但客户端在C++中。通过使用JAVA和C++的套接字发送struct
Struct{
float length;
char[] name;
}myStruct;
我怎么可以转换结构,通过服务器发送的,并且可以通过客户端正确解析字节流?任何示例代码都会有帮助! (我听说XML是一个选项,但我不熟悉它)谢谢。
XML没有做魔术
您可以使用XML或纯文本
做想你已经对子级做了什么对文件进行操作。
你会使用jave将数据写入文件
然后你可以使用C++来读取这个文件。
和套接字相同的是
XML并不特别。纯文本可以做的工作
XML只增加结构
我不会建议自己的繁重任务
实现序列您可以考虑使用JNI/JNA 一个更好的办法是使用CORBA但这可能是一个过度冲击
尝试使用Google的protocol buffers,在谷歌代码的ProtocolBuffers页面托管。小巧高效的python,Java和C++支持。听起来很适合你的需求。
比XML方法更少的开销,比自己滚动更好 - 这比您想象的要困难。
+1不滚动自己 –
考虑JSON的简单(像JSONRPC,或者您只需将自己的JSON)
对于节俭的复杂性
使用JSONRPC http://www.json.org/
很容易产生,很容易解析。主页上有很多可用的库。
例如:'{“length”:3.45,“name”:“John Doe”,“favorite_numers”:[2,3,5,7,11]}' – Notinlist
基于@ finnw的答案...
class MyStruct {
float length;
String name;
}
void send(SocketChannel dst, MyStruct ms) throws IOException {
int len = 5 + ms.name.length();
ByteBuffer buf = ByteBuffer.allocate(len);
buf.putInt(len);
buf.putFloat(ms.length);
buf.put(ms.name.getBytes("US-ASCII"));
buf.put((byte) 0);
buf.flip();
dst.write(buf);
}
在C面
struct mystruct *readMyStruct(int fd) {
uint32_t size;
read(fd, &size, sizeof size);
struct mystruct *result = malloc(size);
read(fd, result, size);
return result;
}
I将确保使用htons()以网络字节顺序在线路上发送我的数据。并使用ntohs()读取网络字节顺序数据并将其转换为主机表示。 – feroze
htons转换unsigned short,也许你可以解释这是如何帮助。 –
+1写在俳句的形式响应! (几乎) –