2012-01-22 3 views
0

У меня есть два пакета клиент и сервер:импорта вопрос/пакет с RMI

enter image description here

пакет клиента содержит интерфейс "I_object":

package client; 

import java.rmi.Remote; 

import java.rmi.RemoteException; 

public interface I_object extends Remote { 

public int Add(int a,int b) throws RemoteException; 

} 

и класс main_client:

package client; 
import java.net.MalformedURLException; 
import java.rmi.Naming; 
import java.rmi.NotBoundException; 
import java.rmi.RemoteException; 

/** 
* 
* @author marwen 
*/ 

public class main_client { 


public static void main(String [] args) throws NotBoundException, MalformedURLException, RemoteException{ 

I_object obj_distant=(I_object) Naming.lookup("rmi://localhost:1000/exemple"); 

System.out.println(obj_distant.Add(5, 9));  

} 
} 

Пакет сервера содержит класс (impl_object), который реализует Ментов интерфейс I_object:

package server; 

import java.rmi.RemoteException; 

import java.rmi.server.UnicastRemoteObject; 


/** 
* 
* @author marwen 
*/ 
public class impl_object extends UnicastRemoteObject implements I_object { 

public impl_object() throws RemoteException 
{} 

public int Add(int a,int b) throws RemoteException{ 
return a+b; 
} 

} 

и, наконец, main_server:

package server; 

import java.net.MalformedURLException; 

import java.rmi.Naming; 

import java.rmi.NotBoundException; 

import java.rmi.RemoteException; 


public class main_server { 

public static void main(String [] args) throws NotBoundException, MalformedURLException, RemoteException{ 

    impl_object obj=new impl_object(); 

    java.rmi.registry.LocateRegistry.createRegistry(1000); 

    Naming.rebind("rmi://localhost:1000/exemple", obj); 

System.out.println("server is running"); 
} 
} 

, если вы заметили, в реализации "impl_object", я не поставил "импорт client.I_object;" Зачем??????? в порядке, если я поставлю «import client.I_object»; для клиентского пакета, поэтому сервер будет «привязан» к клиенту !!! это проблема, когда я отделяю клиент и сервер (я кладу сервер на удаленный компьютер и клиент дома) ??? .... Может кто-нибудь объяснить мне, я не прав?

ответ

0

EDITED ОТВЕТ:

Вы можете ваш интерфейс и класс осущ в отдельный пакет, как model, а затем импортировать их из этого пакета, если вам нравится. Объект Impl - это объект, используемый как сервером, так и клиентом, который не связывает их таким образом (только клиент). Это UnicastRemoteObject используется с JRMP, и оба они должны знать об этом объекте.

+0

Я плохо объяснил, я перефразирую свой вопрос: что я должен переписать интерфейс «I_object» в пакете сервера, или мне нужно импортировать его из клиентского пакета? thanks ^^ –

+0

вы можете поместить свой интерфейс и класс impl в отдельный пакет, такой как модель, а затем импортировать их оттуда, если хотите. Объект Impl - это объект, используемый как сервером, так и клиентом, поэтому он не связывает их таким образом. Это UnicastRemoteObject используется с RMI, и он не связывает их в этом смысле, а должен использоваться для использования вызовов RMI. –

+0

Это объяснение неверно. Если на хосте есть реестр, вы можете использовать любой IP-адрес, который вам нравится связывать с ним с помощью Naming.bind(). Это не имеет ничего общего с адресами связывания сокетов сервера, что я думаю, о чем вы действительно говорите. Они управляются с помощью свойства java.rmi.server.hostname. – EJP

0

Я положил «import client.I_object;» к серверу клиента. Таким образом, сервер будет «привязан» к клиенту.

Слово «связанное» на Java не имеет смысла. Если вас беспокоит утечка класса, вы можете поместить удаленный интерфейс и любые объекты приложения, от которого он зависит, в третий пакет, который является общим как для сервера, так и для клиента.