通过 Java 中的套接字传递对包含在“数据包”对象中的对象的引用

Posted

技术标签:

【中文标题】通过 Java 中的套接字传递对包含在“数据包”对象中的对象的引用【英文标题】:Passing a reference to an object contained within a 'packet' object over a socket in Java 【发布时间】:2014-02-14 09:34:29 【问题描述】:

我知道不可能在另一台机器上或在单独的进程中传递对对象的引用,但是如果被引用的对象也是通过套接字发送的,那么可以将对象作为引用传递吗?或者完成同一件事的唯一方法是将两者都作为对象传递,然后在接收到“数据包”对象时重新附加它们的引用?

在我写这篇文章的时候,我突然想到了另一个想法,Java Serializable 类在引用被序列化时会复制引用的内容吗?

【问题讨论】:

一个“引用”是一个内存地址。您不知道远程系统上的内存地址是什么,所以我会正式说“不”。但是,您可以发送对象的完整副本,并在远程端重建副本。有些人称之为序列化,有些人称之为“编组”,但本质上你将拥有 2 个严格的副本。但是,那些复制品只是……复制品。更改不会影响另一个更改,除非您以某种方式手动同步对象。 这就是我认为我必须要做的。问题是我有两个对象数组,其中包含对另一种类型数组中特定对象的引用。所以我想我将不得不重新创建引用。转发作为答案?这就是我要找的。谢谢。 那么,您有两个对象,每个对象内部都有一个数组/集合,并且它们相互引用?像ManyToMany之类的?您是否考虑过一次发送整个 blob?也许将您需要发送的所有对象包装在某个消息包装器中,这样当它们从另一端弹出时它们都连接在一起? 是的,我愿意。我通过套接字发送包含引用的原始对象。它们作为对象而不是另一侧的引用弹出。收到整个内容后,我需要重新创建引用。 你是如何发送你的对象的?如果您一次发送一个,您将遇到问题。你最好将它们作为一堆发送,已经连接在一起。如果您要发送两个或多个相互引用的对象,您可以创建某种“消息”包装对象将它们放在一起并立即发送。此外,您可能希望查看除本机 Java 序列化框架之外的其他序列化方法。在我以前的工作中,我们曾经使用 XFire 来写出对象,因为它是 XML 并且没有对象版本控制的问题。 【参考方案1】:

您可以传递对对象的引用,因为它只是一个数字。接收端只看到一个数字。

你可以复制一个对象的内容和它的来源地址,但地址对你来说仍然没有用。

Java 序列化进行深度序列化,复制它引用的所有对象。

【讨论】:

@rob 对不可序列化对象的任何引用都会阻止整个数据结构被序列化(并破坏流) 在 Java 中无法获得实际的参考编号。无论哪种方式,这对我都没有帮助。我本质上是在询问如果被引用的对象也是通过套接字发送的,是否有办法保留 Java 引用。我不认为Java可以做到这一点。即使我能得到实际的参考号,在另一台机器上也没有用。即使在另一个进程上,因为该地址不存在该对象。

以上是关于通过 Java 中的套接字传递对包含在“数据包”对象中的对象的引用的主要内容,如果未能解决你的问题,请参考以下文章

通过 C 中的套接字快速接收不同长度数据包的连续流?

Java TCP/IP SocketTCP Socket(含代码)

UNP——第二章,端口号,套接字对,TCP,UDP输出

在C中的两台服务器之间传递数据的最佳方式?

C#中UDP(Socket)

Windows:要求 Socket 传递所有数据包(甚至是损坏的数据包)