Java 服务器上具有单端口的RM over SSL

Java 服务器上具有单端口的RM over SSL,java,sockets,ssl,rmi,Java,Sockets,Ssl,Rmi,案例1-无SSL 当我需要一个简单的RMI连接(没有SSL)时,我在服务器上使用以下代码 Registry registry = LocateRegistry.createRegistry(2004,rmiClientSocketFactory,rmiServerSocketFactory); stub=UnicastRemoteObject.exportObject(someObj, 2004, rmiClientSocketFactory,rmiServerSocketFactory);

案例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)上。但我不想有两个插座。如何解释和修复它

要使其工作,我需要修改服务器上的代码以

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

Registry registry = LocateRegistry.getRegistry(host, 2004, rmiClientSocketFactory);
MyRemoteInterface mri = (MyRemoteInterface)registry.lookup(...);
在任何情况下,不能在同一端口上使用明文和SSL远程对象

要使其工作,我需要修改服务器上的代码以

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

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

在任何情况下,不能在同一端口上使用明文和SSL远程对象

@JarrodRobertson修复了你的编辑。SSL不进行端口共享。只有RMI能做到这一点。如果没有RMI,标题就毫无意义了。@JarrodRobertson修复了你的编辑。SSL不进行端口共享。只有RMI能做到这一点。如果没有RMI,这个标题就毫无意义。