Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI не работает, если клиент и сервер не на localhost / 13 сообщений из 13, страница 1 из 1
31.05.2013, 14:05:34
    #38281570
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
Клиент имеет вот такой вид:
Код: 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
31.05.2013, 23:43:44
    #38282145
shitkod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
Niky4000,

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

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

192.168.1.20 - а это очень похоже на IP вашей машины в вашей локальной сети. Именно по этому IP она принимает сетевые пакеты.
...
Рейтинг: 0 / 0
03.06.2013, 08:47:27
    #38283154
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
В настройке клиента и сервера должен быть одинаковый 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
03.06.2013, 19:28:36
    #38284285
shitkod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
Niky4000,

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

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

А вот клиента бы направлял по тому IP, по которому у тебя отзывается сервер.
...
Рейтинг: 0 / 0
18.06.2013, 15:41:16
    #38301816
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
Долго не доходили руки до этого... были разные потусторонние вещи...
Инициализирую сервер так:
Код: 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
18.06.2013, 15:46:08
    #38301830
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
Код: 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
19.06.2013, 02:10:53
    #38302487
shitkod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
По моему, много лишнего. У меня работает так
Сервер:

Код: 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
19.06.2013, 11:41:06
    #38302881
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
Не знаю...
У меня почему-то так не работает.

Код: 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
20.06.2013, 10:25:29
    #38304287
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMI не работает, если клиент и сервер не на localhost
Niky4000,

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


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


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