【问题标题】:Java send floatbuffer over a tcp socket efficientlyJava 通过 tcp 套接字有效地发送 floatbuffer
【发布时间】:2015-07-10 11:58:11
【问题描述】:

我对 java 中的套接字编程比较陌生,想通过 tcp 套接字从 Floatbuffer 变量发送数据。这应该在安卓平台上运行。

这里有一些代码来说明我想要做什么:

FloatBuffer buf = FloatBuffer.allocate(4);
buf.put(5.5f);
buf.put(1.5f);
buf.put(2.5f);
buf.put(3.5f);

ServerSocket server = new ServerSocket(38300);
con = server.accept();

// somehow send the whole buf variable over the tcp socket

我相信您可以提取每个浮点数并通过套接字单独发送它们,但我想知道是否有更有效的方法来做到这一点?

【问题讨论】:

  • 我看不到您如何发送数据 - 所以很难说出您的“更高效”的问题是什么...您能详细说明您的问题吗?

标签: java sockets tcp buffer


【解决方案1】:

如何为它创建一个支持ByteBuffer。这样,您就如何通过网络传输数据有很多选择。使用SocketChannel,您将获得如此简单的操作。

ByteBuffer buf = ByteBuffer.allocate(floats*4);
FloatBuffer floats = buf.asFloatBuffer();
floats.put(5.5f);
...
ServerSocket server = new ServerSocket(38300);
SocketChannel sc = server.accept().getChannel();
sc.write(buf);

【讨论】:

  • 我今天试过了,但我得到了错误:尝试在空对象引用上调用虚拟方法'int java.nio.channels.SocketChannel.write(java.nio.ByteBuffer)'
  • 听起来你的ByteBuffer 是空的。您是否完全遵循此代码?
  • sc 对象为空,但按照此示例 tutorials.jenkov.com/java-nio/server-socket-channel.html 使其工作
【解决方案2】:

就通过网络发送的数据量而言,高效的解决方案是直接发送浮点数。

每个浮点数都是 32 位长度,如果您需要发送浮点数,则无法减少它。

另一种并不总是适用的替代方法是使用不同的类型发送更少的位

例如代替发送

5.5f
1.5f
2.5f
3.5f

为什么不将它们乘以 10 并只发送 byteshort 原语?

在套接字的另一侧,您可以重建将字节(或短字节)除以 10.0 的浮点数

对于这种解决方案您可以节省 4x(字节)或 2x(简称)通过网络发送的比特

注意:您可以应用此解决方案如果您知道可能的数据范围仅限于相同的已知值。例如发送 0 到 10 之间的值和 1 个十进制数字。

【讨论】:

  • 如果他需要发送5.57f怎么办?
  • 需要查看要发送的数据的取值范围。有时从浮点数传递到字节或从浮点数传递到short 有时是不可能的。
  • 没有始终适用的最佳解决方案。它始终取决于数据的类型。这是适用于示例数据的可能解决方案。如果所有数据都是这种类型,这是一个很好的解决方案,比发送浮点数更好(就通过网络发送的数据而言)。
  • 与其寻求建议的临时解决方案,一种简单而通用的方法(如果网络真的是瓶颈)是在发送之前压缩数据。可能会节省更多的数据,并且在最坏的情况下(完全随机数据),生成的压缩数据不会以任何主要方式超过原始数据。
  • 我再说一遍,这是针对暴露问题的解决方案。在特定范围内发送四个浮点数。如果不是这种情况,可以采取其他可能的方式。但是,如果这个场景很好地代表了现有场景,那么这个解决方案会比其他解决方案更好。作为附加说明,压缩少量随机浮点数在通过网络发送的数据和 CPU 使用率方面效率不高。
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2018-02-05
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多