如果要为RMI使用自定义套接字(例如使用SSL),则需要在UnicastRemoteObject.exportObject(4)中指定客户端套接字工厂以及服务器套接字工厂。但是对象的导出是在服务器端完成的。为什么客户端套接字工厂是必需的?
除非......它被序列化并被想要获取与该对象的连接的客户端使用?我发现这不太可能(尽管可能是答案); (SSL)套接字工厂听起来不像是可序列化对象的经典示例,密钥库是本地的,等等。
答案 0 :(得分:1)
是的,就像你在问题中已经说过的那样:
当与exportObject
或UnicastRemoteObject的构造函数一起使用时,RMIClientSocketFactory必须是可序列化的,并且将序列化到客户端。
这意味着它不能包含对非序列化对象的(非瞬态)引用,只能包含动态创建套接字的必要信息。
(我最近发布了an example for a RMISocketFactory,我需要注意可序列化。)
编辑(在EJP的评论之后):
当然,如果您需要在所有使用客户端套接字工厂,这仅适用于。在许多情况下,您只需使用其他exportObject
方法(或其他构造函数),然后使用服务器端的默认服务器套接字工厂和客户端的默认客户端套接字工厂,而无需序列化任何内容。
是的,没有必要将服务器的信任存储序列化到客户端 - 如果客户端必须信任注册表或其他证书可以接受的远程对象,我们就有了一个人在这里的意思。中间人。因此,SslRMIClientSocketFactory虽然是Serializable,但不会序列化服务器的SSL上下文,而只是使用客户端VM的SSL设置。
答案 1 :(得分:-1)
在 UnicastRemoteObject.exportObject中(...) 您需要指定一个客户端套接字 工厂以及服务器插座 工厂(如果你使用自定义 当然是套接字。)
仅当您使用exportObject()的重载时,即使这样,您也可以提供null。还有另一个重载,您只需指定端口号。
为什么?
不是。
对象的导出在服务器端完成。
正确。
为什么客户端套接字工厂是必需的?
不是。