2016-11-24 4 views
1

Мое впечатление о RMI - это как будто они разные серверы. Я пишу интерфейс как:Реестр RMI и RMI Server имеют разные номера портов?

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; 
     } 
} 

Я хочу надстройку() метод класса выше, чтобы застрять в то время как цикл.

Я пишу программу сервера, как:

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); 
     } 
} 

Я начал rmiregistry в порту 1099 и запустить 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 

Я уже в моей системе работает веб-сервер. Затем я бегу сервера программы, как:

$java pack.Server 

Затем после того, как я бегу клиент в другой машине, как:

$java pack.Client 

Поскольку метод Add() застрял в то время как петля так 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 для сервера.

Смежные вопросы