2016-11-24 114 views
1

我對RMI的印象就好像它們是不同的服務器一樣。我寫的接口爲:RMI註冊表和RMI服務器是否有不同的端口號?

package pack; 
import java.rmi.*; 

public interface AddI extends Remote 
{ 
     public int add(int x, int y) throws Exception; 
} 

的類,它的對象送達如下:

package pack; 
import java.rmi.server.*; 
public class AddC extends UnicastRemoteObject implements AddI 
{ 
     public AddC() throws Exception 
     { 
       super(); 
     } 
     public int add(int x, int y) 
     { 
       int i = 2; 
       while(i>0); 
       return x+y; 
     } 
} 

我想要的add()以上的類的方法,而循環卡住英寸

我寫一個服務器程序爲:

package pack; 
import java.rmi.*; 
public class Server 
{ 
     public static void main(String[] args) throws Exception 
     { 
       AddC obj = new AddC(); 
       Naming.rebind("rmi://10.100.11.238:1099/ADD", obj); 
       System.out.println("Server Started"); 
     } 
} 

然後客戶端程序:

package pack; 
import java.rmi.*; 
public class Client 
{ 
     public static void main(String[] args) throws Exception 
     { 
       AddI obj = (AddI)Naming.lookup("rmi://10.100.11.238:1099/ADD"); 
       int n = obj.add(5, 4); 
       System.out.println(n); 
     } 
} 

我在端口1099啓動rmiregistry中和運行NMAP命令:

$ nmap 127.0.0.1 

Starting Nmap 7.01 (https://nmap.org) at 2016-11-24 15:14 IST 
Nmap scan report for localhost (127.0.0.1) 
Host is up (0.00011s latency). 
Not shown: 997 closed ports 
PORT  STATE SERVICE 
21/tcp open ftp 
80/tcp open http 
1099/tcp open rmiregistry 

我已經在我的系統中運行一個Web服務器。然後我運行的服務器程序:

$java pack.Server 

再經過我在不同的機器上運行的客戶端爲:

$java pack.Client 

由於add()方法一直停留在while循環使RMI服務器還沒有完成。如果我再次運行nmap,它不會顯示任何額外的開放端口。

兩臺服務器是不同的還是相同的?

+0

您還沒有運行客戶端,所以'add()'方法沒有運行,並且沒有額外的連接。由於您已經將註冊表作爲單獨的進程啓動,因此它將使用遠程對象中的不同端口。 – EJP

+0

你的問題沒有意義。在註冊表無意義之前啓動服務器。啓動註冊表和沒有客戶端的服務器不會告訴你有關連接的任何信息。陳述你的*真實*問題,如果有的話。 – EJP

回答

0

RMI被設計成由SUN服務器端的分佈式系統,這意味着你可以有一個rmiregistry運行作爲一個獨立的過程,不同的服務器可以將他們的RMI服務將其註冊和客戶端可以找到從rmiregistry所需的服務(如電話交換機)。

產品用途表明,rmiregistry過程中,只有一個服務器進程主要用於在同一臺機器上,所以rmiregistry和服務器進程可以在服務器進程調用LocateRegistry.createRegistry(<your registry port>);被合併到同一個過程。

由於設計RMI打開2個端口,1個(集成)rmiregistry和1個服務器。