java.rmi.ConnectException: в соединении отказано хосту: 127.0.0.1

Я пытался использовать RMI, вот серверная часть. сначала это работало без каких-либо исключений, но теперь, когда я трижды пытаюсь запустить приведенный ниже код, я получаю некоторые ошибки.

Код:

import java.rmi.server.UnicastRemoteObject;

/**
 * Created by elyas on 12/11/14 AD.
 */
public class LogicImplement extends UnicastRemoteObject implements Logic
{

    public LogicImplement() throws Exception
    {
        java.rmi.registry.LocateRegistry.createRegistry(6060);
        java.rmi.Naming.rebind("Object1",this);
    }

    @Override
    public int sum(int a, int b) throws Exception
    {
        int result = a + b;
        System.out.println("ana sum executed");
        return result;
    }

    public static void main(String[] args)
    {
        try
        {
            LogicImplement logicImplement  = new LogicImplement();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    } 
} 

Ошибка такая: я пытался изменить Object1, например, на Object2, но снова я получаю ошибку, также я меняю номер порта...

что такое решение?

java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
    java.net.ConnectException: Connection refused
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Naming.java:177)
    at LogicImplement.<init>(LogicImplement.java:12)
    at LogicImplement.main(LogicImplement.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
    ... 12 more

person Elyas Hadizadeh    schedule 11.12.2014    source источник


Ответы (4)


java.net.ConnectException: Connection refused

Для этого исключения может быть несколько причин:

  • Вы не запустили rmiregistry в фоновом режиме.
  • Вы пытаетесь подключиться к неправильному номеру порта.
  • Возможно, ваш брандмауэр блокирует соединения.
person Darshan Lila    schedule 11.12.2014
comment
если это из-за брандмауэра, что мне делать? что вы подразумеваете под неправильным номером порта? - person Elyas Hadizadeh; 11.12.2014
comment
Добавьте исключения в брандмауэр, если это вызывает проблемы. Неправильный номер порта означает, что вы могли создать реестр на порту, скажем, 9098, а на стороне клиента получить к нему доступ на 9099. - person Darshan Lila; 11.12.2014
comment
@DarshanLila На 127.0.0.1 не будет проблем с брандмауэром. - person user207421; 11.12.2014
comment
но вы знаете, что я не запускаю клиентскую часть, сначала я запускаю серверную, в начале выполнения я получаю эту ошибку, я хочу сказать, что это не должен быть неправильный номер порта. потому что проблема на стороне сервера... - person Elyas Hadizadeh; 11.12.2014

Ответ был очень прост, По умолчанию реестр работает на порту 1099. Чтобы запустить реестр на другом порту, укажите номер порта в командной строке. Не забудьте сбросить переменную окружения CLASSPATH. для получения дополнительной информации перейдите по этой ссылке: Запуск примеров программ

** Поэтому для исправления этого кода я должен изменить форму номера порта с 6060 на 1099.

обратите внимание, что: если 1099 используется другими службами, вы должны протестировать 1100, а если 1100 также используется, вы должны использовать 1101 и так далее. :-)

person Elyas Hadizadeh    schedule 12.12.2014

Поскольку это была проблема с номером порта, есть еще один способ запустить реестр с нужным номером порта:

java.rmi.registry.Registry rmiRegistry = java.rmi.registry.LocateRegistry.
                createRegistry(6060); // Creates a registry on 6060
rmiRegistry.rebind("Object1",this);   // Binds to registry created on 6060
person Dula    schedule 21.12.2017

Вы не запустили реестр RMI.

Когда вы преодолеете это, если это все еще происходит при вызове удаленного метода, см. пункт A.1 часто задаваемых вопросов по RMI.

person user207421    schedule 11.12.2014
comment
как мне запустить реестр RMI? Я тебя не понял :( - person Elyas Hadizadeh; 11.12.2014