通过套接字传递对(大)数据区域的引用

时间:2009-04-23 19:45:50

标签: java sockets reference

我一直在阅读Java中的引用描述,虽然我觉得我理解它们,但我不确定Java是否允许我执行以下操作:我们在同一个JVM中有两个线程通过套接字进行通信,而我们想要在套接字上传递大部分数据的本地地址,而不复制数据本身。启动时解决方案可能非常明显,但我无法弄清楚!帮助将不胜感激。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这个插座上还有什么东西?如果它是您自己的协议,那么在协议中添加一个动词,说明“从已知位置获取大的东西”,然后发送动词。有多少这些物品?你能制作一个地图 - 字符串,对象 - 并将字符串传递给套接字吗?

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

  1. 将引用放入可以在以后检索的全局位置。通过套接字发送一个对象,该对象在解序时被解析为全局访问引用。 (仅适用于同一JVM)
  2. 通过RMI访问大对象。发送一个对象,该对象在序列化时为您的大对象创建RMI代理。
  3. 使用更高效,更简单的直接API。我建议考虑一个BlockingQueue。

答案 4 :(得分:0)

如果要在同一程序的2个线程之间传递数据,只需通过java.concurrent包中的任何通道传递对该区域的引用。

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

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