RM通过SSL单端口服务器

问题描述:

CASE 1 - 不使用SSL
当我需要一个简单的RMI连接(无SSL)我用下面的代码在服务器上RM通过SSL单端口服务器

Registry registry = LocateRegistry.createRegistry(2004,rmiClientSocketFactory,rmiServerSocketFactory); 
stub=UnicastRemoteObject.exportObject(someObj, 2004, rmiClientSocketFactory,rmiServerSocketFactory); 

请注意我在创建注册表和导出对象时都使用端口号。代码按预期工作 - 没有任何问题。

CASE 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

@JarrodRobertson修复了您的修改。 SSL不会执行端口共享。只有RMI这样做。如果没有RMI,标题就没有意义了。 – EJP

为了使它工作,我需要修改我的服务器代码

Registry registry = LocateRegistry.createRegistry(2004); 

号这是一个倒退一步:你从注册表中删除SSL。在查找注册表时,您需要修改您的客户端以使用SSL。这意味着你必须使用Registry类,而不是Naming

Registry registry = LocateRegistry.getRegistry(host, 2004, rmiClientSocketFactory); 
MyRemoteInterface mri = (MyRemoteInterface)registry.lookup(...); 

在任何情况下,你不能有明文和SSL远程对象相同的端口上。