【问题标题】:Large byte array transfer to client大字节数组传输到客户端
【发布时间】:2011-04-19 15:41:51
【问题描述】:

让我介绍一下我的情况。

我有很多以字节为单位的数据存储在服务器上的文件中。我正在使用 JDK7 中的 AIO 编写和读取这些文件。因此,我使用 ByteBuffer(s) 进行读写操作。

问题是,一旦我对 AsynchronousFileChannel 执行了读取,我想将读取操作中使用的 ByteByffer 的内容传输到客户端。因此我实际上想发送字节。

从这里出发的最佳方式是什么。我不想发送 ByteBuffer,因为我有一个可以重复使用的池,因此这不是一个选项。我还希望能够组合多个读取并一次发送多个 ByteBuffer(s) 组合的内容。

所以我要发送什么。只是一个 byte[] 数组?还是我需要一些流?关于性能的最佳解决方案是什么。

我正在使用 RMI 进行通信。

提前感谢。

【问题讨论】:

  • 用 java 重新标记了您的问题。这样更有可能得到回应。
  • 如果性能很关键,我不会使用标准的 Java RMI。你做的任何其他事情都不太可能产生影响。如果你必须使用 Java RMI,我不会太担心性能。 ;)

标签: java communication bytearray rmi aio


【解决方案1】:

您可以使用RMIIO 库在 rmi 上模拟流,这将允许您通过 RMI 流式传输任意数量的字节,而不会导致任何一端的内存问题。

(免责声明,我写了这个库)

【讨论】:

    【解决方案2】:

    除非有很好的理由不这样做,否则只需发送字节数组以及足够的元数据即可提供可靠的服务。

    您需要通过 RMI 来回传输的底层实现越少越好。尤其是当您使用尚未普遍可用的 Java 7 时。

    【讨论】:

    • 其实没有理由不这样做。我想我会走这条路,因为它接缝最简单,并且不需要涉及其他一些组件/库/什么。
    【解决方案3】:

    要使用 RMI,您必须以 byte[] 的形式检索缓冲区的内容,然后将其写入 ObjectOutputStream(写入发生在幕后)。假设您当前正在使用直接缓冲区,这意味着 CPU 时间在 Java 堆中创建数组,以及 CPU 时间在数组写入后进行垃圾收集,并且流可能会保留引用太久,导致内存不足错误。

    在我看来,更好的方法是打开一个SocketChannel 到目的地并使用它来写入缓冲区的内容。当然,要完成这项工作,您需要编写额外的数据来描述缓冲区的大小,这可能会演变成一种通信协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2011-10-31
      • 2019-04-15
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多