【问题标题】:Passing a reference to a (large) data area across a socket通过套接字传递对(大)数据区域的引用
【发布时间】:2009-04-23 19:45:50
【问题描述】:

我一直在阅读 Java 中引用的描述,虽然我觉得我理解它们,但我不确定 Java 是否允许我执行以下操作:我们在同一个 JVM 中有两个线程通过套接字进行通信,并且我们想通过套接字传递本质上是大块数据的地址,而不复制数据本身。解决方案对初学者来说可能很明显,但我想不通!帮助将不胜感激。

【问题讨论】:

  • 组件中的两个套接字是否以某种方式相互分区,例如单独的类加载器?这是针对通常在不同主机上运行的两个程序碰巧在同一进程中运行的特殊情况的优化吗?我想我只是想知道为什么不能正常传递参数。
  • 这里有很多好的建议!谢谢大家!

标签: java sockets reference


【解决方案1】:

这个插座上还有什么东西?如果是你自己的协议,那么在协议中添加一个动词,上面写着“从已知位置获取那个大东西”,然后发送动词。这些物体有多少?你能制作一个映射 - 字符串、对象 - 并通过套接字传递字符串吗?

【讨论】:

  • 其实我喜欢这样!谢谢!它让我想起了几年前我在另一个环境中所做的事情——想知道为什么我没有想到它:-)
【解决方案2】:

AFAIK Java 不提供获取对象内存引用的方法。不过,可能对您有用的是使用共享数组或共享向量,您可以将数据作为对象放入向量/数组中,并通过套接字传递对象的索引。

【讨论】:

    【解决方案3】:

    使用 JNI 可能是可能的,但我认为使用纯 Java 是不可能的。

    鉴于您在同一个 JVM 中(这是您使其工作的唯一机会,除非您使用内存映射文件)您真的必须使用套接字吗?你不能创建一个更“直接”的 API 吗?

    【讨论】:

      【解决方案4】:

      有两种方法可以做到这一点。

      1. 将引用放入一个全局位置,以便以后检索。通过套接字发送一个对象,该对象在反序列化时被解析为全局访问引用。 (仅适用于同一个 JVM)
      2. 使大对象可通过 RMI 访问。发送一个对象,该对象在反序列化时会为您的大对象创建一个 RMI 代理。

      使用更高效、更简单的直接 API。我建议考虑使用 BlockingQueue。

      【讨论】:

        【解决方案5】:

        如果您在同一程序的 2 个线程之间传递数据,您可以简单地通过 java.concurrent 包中的任何通道传递对该区域的引用。

        如果您正在运行 2 个单独的程序,那么您必须序列化数据(如果您真的希望传递数据本身)。

        如果您只想访问数据,您可以发布一个通过 RMI 执行所需转换的服务。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-18
          • 2023-03-11
          • 1970-01-01
          相关资源
          最近更新 更多