本文介紹了服務器上具有單端口的基于SSL的RM的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
案例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)上。但我不想要兩個插座。如何解釋和修復?
推薦答案
要使其正常工作,我需要將服務器上的代碼修改為
Registry registry = LocateRegistry.createRegistry(2004);
不。這是一個倒退的步驟:您正在從注冊表中刪除SSL。您需要修改客戶端以在查找注冊表時使用SSL。這意味著您必須使用Registry
類,而不是Naming
:
Registry registry = LocateRegistry.getRegistry(host, 2004, rmiClientSocketFactory);
MyRemoteInterface mri = (MyRemoteInterface)registry.lookup(...);
在任何情況下,您都不能在同一端口上擁有純文本和SSL遠程對象。
這篇關于服務器上具有單端口的基于SSL的RM的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,