NotBoundException, когда я пытаюсь подключиться к серверу RMI

#java #rmi

#java #rmi

Вопрос:

Я пытаюсь запустить это приложение, используя клиент-сервер RMI. Во-первых, я запустил его и получил сообщение об ошибке «Отказано в подключении к хосту: localhost». После этого я пошел в system32 / drivers / etc / hosts и исправил это, добавил строку:

127.0.0.1 localhost

Это не привело меня к решению проблемы. Затем я просмотрел те же вопросы в stackoverflow о том, как исправить эту проблему, а затем решил ее с помощью (запускался в cmd):

 start rmiregistry
  

Итак, rmiregistry запустился, и я получил новую ошибку — NotBoundException (но я мог бы исправить проблему «Отказа в подключении»).

servicebrowser.java:

 package servicebrowser;

import java.awt.*;
import javax.swing.*;
import java.rmi.*;
import java.awt.event.*;


public class ServiceBrowser {


    JPanel mainPanel;
    JComboBox serviceList;
    ServiceServer server;

    public void buildGUI() {


        Object[] services = getServicesList();


    }


    Object[] getServicesList() {
        Object obj = null;
        Object[] services = null;

        try {

            obj = Naming.lookup("rmi://127.0.0.1/ServiceServer");

        }
        catch (Exception ex) { ex.printStackTrace(); }

        server = (ServiceServer) obj;

        try {
            services = server.getServiceList();
        }
        catch (Exception ex) { ex.printStackTrace(); }
        return services;        
    }

    class MyListListener implements ActionListener {
        public void actionPerformed(ActionEvent ev) {
            Object selection = serviceList.getSelectedItem();
            loadService(selection);           
        }        

    }



    public static void main(String[] args) {

       new ServiceBrowser().buildGUI(); 


    }

}
  

класс ServiceServerImpl:

 import java.rmi.*;
import java.util.*;
import java.rmi.server.*;


public class ServiceServerImpl extends UnicastRemoteObject
    implements ServiceServer {

    HashMap serviceList;

    public ServiceServerImpl() throws RemoteException {
        setUpServices();
    }

    private void setUpServices() {
        serviceList = new HashMap();

    }

    public Object[] getServiceList() {
        System.out.println("in remote");
        return serviceList.keySet().toArray();       
    }

    public Service getService(Object serviceKey) throws RemoteException {
        Service theService = (Service) serviceList.get(serviceKey);
        return theService;
    }


    public static void main (String[] args) {

        try {

            Naming.rebind("ServiceServer", new ServiceServerImpl());   

        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        System.out.println("Remote service is running");
    }

}
  

Что с этим не так? Я, конечно, тоже отключил брандмауэр.

Комментарии:

1. У вас есть трассировка стека, которую вы можете нам показать? Какая строка выдает эту ошибку? Ваше смешивание в обсуждении других ошибок, которые вы (все еще?) получение сбивает с толку.

2. О, нет. Я исправил последние ошибки. Теперь у меня есть только одно: «NotBoundException».

3. Если только ваш сервер, клиент и сервис-браузер не запущены на одном компьютере, Naming.lookup("rmi://127.0.0.1/ServiceServer") выполняется поиск на неправильном хосте. Вам необходимо указать имя хоста или IP-адрес хоста сервера. Что также означает, что вам не нужно запускать rmiregistry на хосте клиента.

4. Если я не запускаю rmiregistry на своем локальном хосте, этот код выдает исключение с сообщением «Отказано в подключении к хосту: localhost»

5. Вам нужно запустить его на хосте сервера, а не на хосте клиента.

Ответ №1:

Большое спасибо!

Я решил свою проблему именно таким образом.

Во-первых, я отредактировал классы servicebrowser, ServiceServerImpl.

класс servicebrowser:

До того , как:

  try {

     obj = Naming.lookup("rmi://127.0.0.1/ServiceServer");

 }
  

Теперь (плюс я добавил импорт java.rmi.registry.LocateRegistry, импортируйте java.rmi.registry.Registry в верхнюю часть кода):

 try {
    Registry registry = LocateRegistry.getRegistry("127.0.0.1", 10001);
    obj = registry.lookup("ServiceServer");

}
  

класс ServiceServerImpl:

До того , как:

 try {

    Naming.rebind("ServiceServer", new ServiceServerImpl());   

}
  

Теперь (как и в предыдущем классе, я добавил классы импорта в верхнюю часть кода):

 try {
    Registry registry = LocateRegistry.createRegistry(10001);
    registry.bind("ServiceServer", new ServiceServerImpl());   

}
  

Во-вторых, я пытаюсь запустить project (F6) в Netbeans, где servicebrowser помечен как основной класс. Это снова было отказное соединение. После этого я запустил только класс ServiceServerImpl (Shift F6), а затем запустил весь проект. Итак, это работает.

PS Я не использовал cmd и не пытался

«запустить rmiregistry»

потому что приложение работает без него.

Комментарии:

1. Первая серия изменений не имела никакого значения. Код полностью эквивалентен, за исключением того, что вы используете другой порт.

2. Мм… Это может быть правдой, но если я использую другой порт в начальной версии приложения (например, 10001), вот так: obj = Именование. поиск(«rmi://127.0.0.1:10001 / ServiceServer»); и попробуйте запустить класс, а затем запустить весь проект, это привело к «отказу в подключении». Что с этим не так?