案例1 - 没有SSL
当我需要一个简单的RMI连接(没有SSL)时,我在服务器上使用以下代码
Registry registry = LocateRegistry.createRegistry(2004,rmiClientSocketFactory,rmiServerSocketFactory);
stub=UnicastRemoteObject.exportObject(someObj, 2004, rmiClientSocketFactory,rmiServerSocketFactory);
请注意我在创建注册表和导出对象时都使用端口号。代码按预期工作 - 没有任何问题。
案例2 - 使用SSL
我使用与案例1相同的代码,只有两个工厂都是SSL工厂。结果 - 在服务器端,在端口2004上创建了一个套接字,但我的客户端无法连接到它 - 它会抛出
java.rmi.ConnectIOException: non-JRMP server at remote endpoint
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:248)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:342)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at rmi.DateClient.perform(DateClient.java:48)
at rmi.DateClient.main(DateClient.java:38)
Exception occured: java.rmi.ConnectIOException: non-JRMP server at remote endpoint
要使其正常工作,我需要将服务器上的代码修改为
Registry registry = LocateRegistry.createRegistry(2004);
stub = UnicastRemoteObject.exportObject(someObj, 0, rmiClientSocketFactory, rmiServerSocketFactory);
此代码有效,但在服务器端,在端口2004上创建了一个套接字,在某个变量端口上创建了一个套接字(例如45329)。但我不想要两个插座。如何解释和修复它?
答案 0 :(得分:1)
要使其正常工作,我需要将服务器上的代码修改为
Registry registry = LocateRegistry.createRegistry(2004);
没有。这是一个倒退的步骤:您从注册表中删除SSL。在查找注册表时,您需要修改客户端以使用SSL。这意味着您必须使用Registry
类而不是Naming
:
Registry registry = LocateRegistry.getRegistry(host, 2004, rmiClientSocketFactory);
MyRemoteInterface mri = (MyRemoteInterface)registry.lookup(...);
在任何情况下,您都无法在同一端口上安装纯文本和SSL远程对象。