【问题标题】:Parcel through socket通过插座包裹
【发布时间】:2016-12-09 19:22:47
【问题描述】:

我正在尝试通过套接字将包裹发送到 Android 应用程序。客户端位于 libbinder(c++) 中,服务器是一个必须重建包裹的 android 应用程序。我一直在寻找解决方案一段时间,但我不知道如何序列化包裹然后在服务器端重新构建它。关于如何做到这一点的任何想法?

谢谢

我处理数据的代码部分

客户

Parcel parc = Parcel();
double three = 5.5;
parc.writeDouble(three);

unsigned char b[sizeof(parc)];
std::memcpy(b, &parc, sizeof(parc));

那我就这样发送

send(client, b, sizeof(b), 0);

服务器

private int count
private InputStream in = null;
try {
    in = socket.getInputStream();
} catch (IOException e) {
    e.printStackTrace();
}
try {
    count = in.read(bytes);
}catch (IOException e) {
    e.printStackTrace();
}

Parcel parcel = Parcel.obtain();
parcel.unmarshall(bytes, 0, bytes.length);
parcel.setDataPosition(0);

double d = parcel.readDouble();

Log.v("----double---", "double" + d);

【问题讨论】:

    标签: java android c++ sockets parcel


    【解决方案1】:

    一个很好的例子可以找到here

    一般来说,您需要确保您拥有可用于重建(从包裹创建)对象的类。

    【讨论】:

    • 所以...从我从该示例中意识到,我可以使用 unmarshall 函数从字节数组重新构建一个包裹。关于如何在客户端 libbinder(c++) 序列化包裹的任何想法?
    • 最简单的方法是查看source code of the Parcel class。基本上,它只是一个序列化的字节流。查看方法writeValue()。您可以看到,对于每个项目,它都会编写指示项目是什么的代码,然后是项目的序列化字节。创建一个简单的程序,将一堆不同的已知类型打包,然后转储字节流。你应该能够弄清楚。
    • Parcel.cpp的源代码可以在这里找到:android.googlesource.com/platform/frameworks/native/+/…如果你使用libbinder,你应该可以直接使用Parcel类。
    • 我创建了一个包裹物品然后通过套接字发送包裹的程序。我曾经使用 memcpy 将它放在一个字节数组上(我认为问题可能在这里),然后发送字节数组,但结果是一样的。在服务器端,我通过输入流从套接字接收并读取到字节数组。然后我使用 unmarshal 函数创建一个包裹。当我阅读这些项目时,这些值不正确。这是否意味着我无法通过套接字传递包裹,还是由于 c++/java 之间的兼容性问题?很抱歉打扰你,但我真的被困住了
    • 你应该可以做到这一点。你能检查你得到的字节流,看看它是什么样子的吗?您可能只是偏离了几个字节,或者字节顺序 (LSB/MSB) 不同。发布您用于发送和接收的代码。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多