【问题标题】:Client socket factory in RMI exportObject?RMI exportObject 中的客户端套接字工厂?
【发布时间】:2011-06-07 19:44:19
【问题描述】:

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

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

【问题讨论】:

    标签: java ssl rmi serversocket socketfactory


    【解决方案1】:

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

    当与exportObject 或 UnicastRemoteObject 的构造函数一起使用时,RMIClientSocketFactory 必须是可序列化的,并且序列化到另一端的客户端

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

    (我最近发布了an example for a RMISocketFactory,我需要注意可序列化。)


    编辑(在 EJP 的评论之后):

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

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

    【讨论】:

    • 没有解决问题中潜在的谬误。
    • 当然,如果您需要专门的套接字,例如通过防火墙,您只需要客户端套接字工厂。但是如果我理解正确的话,除了在客户端使用RMISocketFactory.setSocketFactory() 设置VM 范围之外,没有其他方法可以设置工厂。
    • 同意。目前还不清楚 OP 在这里实际问的是什么。
    【解决方案2】:

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

    仅当您使用 exportObject() 的重载时,您才能提供 null。还有另一个重载,您只需指定端口号。

    为什么会这样?

    不是。

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

    正确。

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

    不是。

    【讨论】:

    • 我知道还有其他重载。这就是为什么我说“当然,如果你完全使用自定义套接字”。
    • @Bart van Heukelom 你说过,我再次引用,你'需要指定一个客户端套接字工厂'。你没有。也许您需要改写您的问题,而不是用自己的话争论。
    • 需要使用自定义套接字(SSL),所以我需要指定一个套接字工厂,否则使用默认的。您对另一个答案投了反对票,因为它“没有解决问题中潜在的谬误。”。好吧,我对你的投了反对票,因为它只是用来指出你在问题中感知到的“谬误”,并且以不必要的冗长“你在第一句话之后说的一切都是错误的”之类的方式,它并没有实际上回答它。如果您觉得有什么需要指出的,请对问题发表评论。
    • @Bart van Heukelom:SSL 是使用自定义客户端套接字工厂的原因。还有其他的。那不是OP所要求的。他的问题包含一个谬误:“为什么需要客户端套接字工厂?”他们不是。它们是在需要的情况下使用的可选工具。因此我投反对票。只有指出谬误,才能回答谬误的问题。
    • @Downvoter 请用这个正确答案解释你的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多