2013-12-02 3 views
4

У меня есть проблема, что когда я запускаю мой RMI сервер я получил исключение notbound исключения даже я экспортировать удаленный объект и привязать его к реестру вот мой код удаленного интерфейсаИсключения в потоке «главный» java.rmi.NotBoundException

import java.rmi.Remote; 
    public interface fact extends Remote { 
    public int factory(int a); 
    } 

и здесь реализация интерфейса

public class factimport implements fact { 

    @Override 
    public int factory(int a) { 
     int mult=1; 
     for (int i=1;i<=a;i++) 
      mult=mult*i; 
     return mult; 
    } 

} 

и сервер код

import java.net.MalformedURLException; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 


public class Server extends UnicastRemoteObject { 
/** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

protected Server() throws RemoteException { 
     super(); 

    } 

public static void main() throws RemoteException, MalformedURLException{ 
    factimport fi=new factimport(); 
    Registry reg=LocateRegistry.createRegistry(1099); 
    reg.rebind("factobject", exportObject(fi)); 
    System.out.println("server started"); 
} 
} 

и клиент

import java.net.MalformedURLException; 
import java.rmi.NotBoundException; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 


public class Client { 

    /** 
    * @param args 
    * @throws NotBoundException 
    * @throws RemoteException 
    * @throws MalformedURLException 
    */ 
    public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException { 
     // TODO Auto-generated method stub 
     Registry reg=LocateRegistry.getRegistry("127.0.0.1",1099); 
    factimport x=(factimport)reg.lookup("factobject"); 
    System.out.println(x.factory(5)); 

} 
} 

ответ

3
  1. Если вы не бежите сервер и клиент на том же хосте, что делает RMI довольно бессмысленным, ваш getRegistry() вызов в клиенте должен быть изменен, чтобы указать на хост-сервер, а не клиент хост (сам).

  2. Ваш удаленный метод должен быть объявлен для броска RemoteException в удаленном интерфейсе.

  3. Если вы не запустить rmic на удаленный интерфейс, который вы не можете быть сделано, или вы бы обнаруженным (2), необходимо изменить exportObject() вызов exportObject(fi, 0), по причинам, изложенным в преамбуле к Javadoc для UnicastRemoteObject.

  4. У вашего Server.main() метода нет правильной подписи, чтобы он не выполнялся. Это должно быть public static void main(String[] args) ...

  5. Вы должны сделать переменную Registry reg на статическом сервере, чтобы предотвратить сбор мусора.

  6. В клиенте, переменная типа factimport должна быть типа fact, и вы должны привести результат поиска для fact.

  7. Если BindException был действительно результат выполнения этого кода в этом состоянии на единственная машина, это может означать, что при запуске сервера вы игнорировали исключения во время выполнения.

+1

Держу пари, что он работает как на одном компьютере. Это, очевидно, просто эксперимент по изучению программирования RMI, и пока нет реальных приложений. – tbodt

+0

@tbodt Ваши ставки могут быть очень интересными для вас, но то, что я здесь написал, по-прежнему верен. Кто бы ни задерживал это, не знает, о чем они говорят – EJP

+0

Время, чтобы признать это: я ниспровергаю. То, что вы говорите, правильно. Но это не имеет значения. – tbodt

-2

Ваш код немного неортодоксальные. Я не знаю, поможет ли это, но может.

Как правило, реализация удаленного объекта будет распространяться на UnicastRemoteObject. Итак, у вас есть этот factimport класс:

public class factimport implements fact extends UnicastRemoteObject { 

    @Override 
    public int factory(int a) { 
     int mult=1; 
     for (int i=1;i<=a;i++) 
      mult=mult*i; 
     return mult; 
    } 

} 

и класс сервера:

public class Server { 
/** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

protected Server() throws RemoteException { 
     super(); 

    } 

public static void main() throws RemoteException, MalformedURLException{ 
    factimport fi=new factimport(); 
    Registry reg=LocateRegistry.createRegistry(1099); 
    reg.rebind("factobject", fi); 
    System.out.println("server started"); 
} 
} 

Я надеюсь, что это будет работать.

+0

им СРЮ но не помогло же ошибка – Tony

+0

я думаю, что мне нужно exportobject в реестр тоже, но я не знаю, как сделать это с ур редактировать – Tony

+1

1. OP уже экспортирует удаленный объект, с помощью 'UnicastRemoteObject .exportObject(). '2.Конструктору для 'Server' не нужно бросать' RemoteException ', или даже даже существовать. 3. Ничто из этого не имеет ничего общего с 'BindException.' -1 – EJP

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