2010-02-04 31 views
4

我有一个套接字,其中服务器在JAVA中,但客户端在C++中。通过使用JAVA和C++的套接字发送struct

Struct{ 
    float length; 
    char[] name; 
}myStruct; 

我怎么可以转换结构,通过服务器发送的,并且可以通过客户端正确解析字节流?任何示例代码都会有帮助! (我听说XML是一个选项,但我不熟悉它)谢谢。

回答

2

XML没有做魔术
您可以使用XML或纯文本
做想你已经对子级做了什么对文件进行操作。
你会使用jave将数据写入文件
然后你可以使用C++来读取这个文件。

和套接字相同的是
XML并不特别。纯文本可以做的工作
XML只增加结构

我不会建议自己的繁重任务

实现序列

您可以考虑使用JNI/JNA 一个更好的办法是使用CORBA但这可能是一个过度冲击

+0

+1写在俳句的形式响应! (几乎) –

9

尝试使用Google的protocol buffers,在谷歌代码的ProtocolBuffers页面托管。小巧高效的python,Java和C++支持。听起来很适合你的需求。

比XML方法更少的开销,比自己滚动更好 - 这比您想象的要困难。

+0

+1不滚动自己 –

0

考虑JSON的简单(像JSONRPC,或者您只需将自己的JSON)
对于节俭的复杂性

1

使用JSONRPC http://www.json.org/

很容易产生,很容易解析。主页上有很多可用的库。

+0

例如:'{“length”:3.45,“name”:“John Doe”,“favorite_numers”:[2,3,5,7,11]}' – Notinlist

2

基于@ 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; 
} 
+1

I将确保使用htons()以网络字节顺序在线路上发送我的数据。并使用ntohs()读取网络字节顺序数据并将其转换为主机表示。 – feroze

+1

htons转换unsigned short,也许你可以解释这是如何帮助。 –