0

如果您想为 RMI 使用自定义套接字(例如使用 SSL),在UnicastRemoteObject.exportObject(4)中,您需要指定客户端套接字工厂和服务器套接字工厂。但是对象的导出是在服务器端完成的。为什么需要客户端套接字工厂?

除非......它被序列化并被想要获得与该对象的连接的客户端使用?我发现这不太可能(尽管这可能是答案);(SSL) 对我来说,套接字工厂听起来不像是可序列化对象的经典示例,密钥库是本地的,诸如此类。

4

2 回答 2

1

是的,就像您在问题中已经说过的那样:

RMIClientSocketFactory 必须是可序列化的,并且在与exportObjectUnicastRemoteObject 的构造函数一起使用时被序列化到客户端另一端。

这意味着它不能包含对不可序列化对象的(非瞬态)引用,只包含动态创建套接字的必要信息。

(我最近发布了一个 RMISocketFactory 示例,我需要注意可序列化。)


编辑(在 EJP 发表评论后):

当然,这只适用于完全需要使用客户端套接字工厂的情况。在许多情况下,您可以简单地使用其他exportObject方法(或其他构造函数),然后在服务器端使用默认服务器套接字工厂,在客户端使用默认客户端套接字工厂,而无需序列化任何内容。

是的,没有必要将服务器的信任存储序列化给客户端——如果客户端必须信任注册表或其他要接受证书的远程对象,我们就有了中间人攻击的要点。因此SslRMIClientSocketFactory虽然是可序列化的,但不会序列化服务器的 SSL 上下文,而只是使用客户端 VM 的 SSL 设置。

于 2011-06-07T22:54:05.057 回答
-1

在 UnicastRemoteObject.exportObject(...) 中,您需要指定客户端套接字工厂和服务器套接字工厂(当然,如果您完全使用自定义套接字)。

仅当您使用 exportObject() 的重载时,即使这样您也可以提供空值。还有另一个重载,您只需指定端口号。

这是为什么?

它不是。

对象的导出是在服务器端完成的。

正确的。

为什么需要客户端套接字工厂?

它不是。

于 2011-06-08T11:23:52.410 回答