powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI не работает, если клиент и сервер не на localhost
13 сообщений из 13, страница 1 из 1
RMI не работает, если клиент и сервер не на localhost
    #38281570
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Клиент имеет вот такой вид:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
        try {
            Hello stub=(Hello) Naming.lookup("rmi://172.16.1.192:1098/Hello");
            String response = stub.helloWorld();
            System.out.println("response: " + response);
        } catch (Exception e) {
            System.err.println("Client exception: " + e.getMessage());
            e.printStackTrace();
        }




Вот сервер:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
    public static void main(String[] args) {
        // TODO code application logic here

        NewJFrame r=new NewJFrame();

    }

....
....

        initComponents();
        this.setVisible(true);
        RMIServer rs=new RMIServer();
        rs.init();
....
....

public class RMIServer implements Hello{
private Hello stub;
        public void init(){
    
       try {
            //obj = new ZRMIServer();
            stub = (Hello) UnicastRemoteObject.exportObject(this, 1098);
            //Remote stub=UnicastRemoteObject.exportObject(obj,0);

            // Bind the remote object's stub in the registry
            Registry registry = LocateRegistry.createRegistry(1098);
            registry.rebind("Hello", stub);

            System.out.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.getMessage());
            e.printStackTrace();
        }
    
    }

    @Override
    public String helloWorld() throws RemoteException {
        return "Hello World!";
    }
}





А вот какая ошибка возникает если они находятся на разных host'ах:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Client exception: no such object in table
java.rmi.NoSuchObjectException: no such object in table
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
	at $Proxy0.helloWorld(Unknown Source)
	at zrmiclient.ZRMIClient.main(ZRMIClient.java:33)


Если оба на localhost, то всё нормально.

Может библиотек каких не хватает?
Если сервер не запущен, то валится исключение на socket. То есть он вроде как соединяется, но не может найти какой-то объект в какой-то таблице. Чего ему надо?
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38282145
shitkod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Niky4000,

В настройке клиента и сервера должен быть одинаковый IP. У меня не работало даже если у сервера localhost а у клиента 127.0.0.1.
Прописал серверу текущий (типа 192.168.1.20) и такой же клиенту и все запустилось :)
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38282224
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все правильно, только в java отношения не имеет. localhost обычно это домен, которому сопоставлен адрес 127.0.0.1. Т.е. в подавляющем большинстве случаев это одно и тоже.

172.16.1.192 - а вот это очень похоже на ваш внешний IP, через который вы общаетесь с интернетом. И не факт, что он для вас выделенный. То есть фактически через него на вашу машину не попасть.

192.168.1.20 - а это очень похоже на IP вашей машины в вашей локальной сети. Именно по этому IP она принимает сетевые пакеты.
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38283154
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В настройке клиента и сервера должен быть одинаковый IP. У меня не работало даже если у сервера localhost а у клиента 127.0.0.1.
Прописал серверу текущий (типа 192.168.1.20) и такой же клиенту и все запустилось :)
Я не очень понял что значит прописать серверу текущий. В каком месте?
Код: sql
1.
2.
3.
4.
5.
6.
            stub = (Hello) UnicastRemoteObject.exportObject(this, 1098);
            //Remote stub=UnicastRemoteObject.exportObject(obj,0);

            // Bind the remote object's stub in the registry
            Registry registry = LocateRegistry.createRegistry(1098);
            registry.rebind("Hello", stub);


Сервер же просто слушает порт 1098 от всех IP.


172.16.1.192 - а вот это очень похоже на ваш внешний IP, через который вы общаетесь с интернетом. И не факт, что он для вас выделенный. То есть фактически через него на вашу машину не попасть.
Не, это адрес из локальной сети. У нас просто сеть такая.
10.0.0.0
172.16.0.0 - 172.32.0.0
192.168.0.0
Это не внешний адрес.
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38284285
shitkod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Niky4000,

У LocateRegistry.createRegistry есть другой конструктор, в котором можно указать IP сервера

А в lookup("rmi://172.16.1.192:1098/Hello") клиента указать этот же IP
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38284683
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У LocateRegistry.createRegistry есть другой конструктор, в котором можно указать IP сервера
Да?
Надо попробовать.
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38287194
Шаров Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы не парился и сервер RMI запускал на localhost - это же сервер!

А вот клиента бы направлял по тому IP, по которому у тебя отзывается сервер.
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38301816
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Долго не доходили руки до этого... были разные потусторонние вещи...
Инициализирую сервер так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
        public void init(){
    
       try {
            //obj = new ZRMIServer();
            stub = (Hello) UnicastRemoteObject.exportObject(this, 1098);
            //Remote stub=UnicastRemoteObject.exportObject(obj,0);

            // Bind the remote object's stub in the registry
            RMIClientSocketFactory rcli=new RMIClientSocketFactory() {

                @Override
                public Socket createSocket(String host, int port) throws IOException {
                    InetAddress ia=InetAddress.getByAddress(new byte[]{(byte)172,(byte)16,(byte)1,(byte)192});
                    return new Socket(InetAddress.getLocalHost(),1212);
                }
            };
            
            RMIServerSocketFactory rser=new RMIServerSocketFactory() {

                @Override
                public ServerSocket createServerSocket(int port) throws IOException {
                    InetAddress ia=InetAddress.getByAddress(new byte[]{(byte)172,(byte)16,(byte)1,(byte)192});
                    return new ServerSocket(1224);
                }
            };
            
            Registry registry = LocateRegistry.createRegistry(1098,rcli,rser);
            registry.rebind("Hello", stub);

            System.out.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.getMessage());
            e.printStackTrace();
        }
    
    }



Клиент такой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        try {
            Hello stub=(Hello) Naming.lookup("rmi://172.16.1.192:1224/Hello");
            
            String response = stub.helloWorld();
            
            System.out.println("response: " + response);
        } catch (Exception e) {
            System.err.println("Client exception: " + e.getMessage());
            e.printStackTrace();
        }



Вроде, работает.



Я бы не парился и сервер RMI запускал на localhost - это же сервер!

А вот клиента бы направлял по тому IP, по которому у тебя отзывается сервер.

Registry registry = LocateRegistry.createRegistry(1098);
Работает почему-то только с localhost-клиентами, а всем остальным отказывает в соединении.
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38301830
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
            RMIClientSocketFactory rcli=new RMIClientSocketFactory() {

                @Override
                public Socket createSocket(String host, int port) throws IOException {
                    //InetAddress ia=InetAddress.getByAddress(new byte[]{(byte)172,(byte)16,(byte)1,(byte)192});
                    return new Socket();
                }
            };
            
            RMIServerSocketFactory rser=new RMIServerSocketFactory() {

                @Override
                public ServerSocket createServerSocket(int port) throws IOException {
                    //InetAddress ia=InetAddress.getByAddress(new byte[]{(byte)172,(byte)16,(byte)1,(byte)192});
                    return new ServerSocket(1224);
                }
            };


И так тоже работает.
Не очень понимаю смысла:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
            RMIClientSocketFactory rcli=new RMIClientSocketFactory() {

                @Override
                public Socket createSocket(String host, int port) throws IOException {
                    //InetAddress ia=InetAddress.getByAddress(new byte[]{(byte)172,(byte)16,(byte)1,(byte)192});
                    return new Socket();
                }
            };


Это сервер клиенту сокет новый просто создаёт что ли, через который он потом будет с ним общаться?
Я так понимаю что если задать порт, то все клиенты будут открывать соединения только с определённого порта, а если его не задавать, то с какого-то любого, но на один и тот же серверный порт (в данном случае 1224)?
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38302487
shitkod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По моему, много лишнего. У меня работает так
Сервер:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public void init(){
    
       try {
           host = InetAddress.getLocalHost().getHostAddress();
            Registry r = LocateRegistry.createRegistry(port);
            r.rebind("rmi://" + host + ":"+ port + "/" + service, new ImplementDB());
            System.out.println("Server ready");
        } catch (UnknownHostException | RemoteException e) {
            System.err.println("Server exception: " + e.getMessage());
        }
    }



Клиент:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    private void InitRegistri(){
        try
        {
            Registry = LocateRegistry.getRegistry(host, port);
            WorkDB = (InterfaceDB) Registry.lookup("rmi://" + host + ":"+ port + "/" + service);
        }
        catch (RemoteException ex)
        {
            //ex.printStackTrace();
            System.out.println();
            System.out.println("RemoteException");
            System.out.println(ex);
            JOptionPane.showMessageDialog(this, "Ошибка соединения с сервером!\nПроверьте IP-адрес", "Подключение", JOptionPane.ERROR_MESSAGE);
        }
        catch (NotBoundException ex)
        {
            //ex.printStackTrace();
            System.out.println();
            System.out.println(
                       "NotBoundException");
            System.out.println(ex);
        }
        catch (Exception e) {
            System.err.println("Client exception: " + e.getMessage());
        }
    }



А сокеты создаются автоматически
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38302881
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю...
У меня почему-то так не работает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
run:
Client exception: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: zrmiserver.RMIServer$3
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: zrmiserver.RMIServer$3
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Naming.java:101)
	at zrmiclient.ZRMIClient.main(ZRMIClient.java:33)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: zrmiserver.RMIServer$3
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
	... 3 more
Caused by: java.io.NotSerializableException: zrmiserver.RMIServer$3
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
	at sun.rmi.transport.Transport$1.run(Transport.java:177)
	at sun.rmi.transport.Transport$1.run(Transport.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38304287
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niky4000,

Это уже проблемы либо клиента, либо сервера. Вы где-то объект передаете, который сериализоваться полностью не может. Судя по трейсам, это возвращаемое значение метода, который по RMI вызывается.
...
Рейтинг: 0 / 0
RMI не работает, если клиент и сервер не на localhost
    #38304623
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
    @Override
    public String helloWorld() throws RemoteException {
        return "Hello World!";
    }


В данном тестировочном случае возвращаемое значение - это строка.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI не работает, если клиент и сервер не на localhost
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]