Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 07.02.2010, 16:33   #1
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию Java RMI connection timed out

Привет.
Разбираюсь с RMI, пока вроде все шло гладко, но никак не получается установить соединение между клиентом и сервером.
Сделал все как полагается. На сервере написал интерфейс, который наследует Remote, написал класс, который этот интерфейс реализует. Сделал заглушку. Запускаю сервер, сервер запускается нормально.
Запускаю клиента - вроде все нормально, получаю заглушку серверного интерфейса, но при попытке вызвать метод сервера через заглушку получаю java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection timed out: connect

Код сервера
Интерфейс
Код:
package rmiserver;
import java.rmi.*;

public interface ServerInformation extends Remote{
    String printReport(Report r) throws RemoteException;
}
Реализация интерфейса
Код:
package rmiserver;
import java.rmi.*;
import java.rmi.server.*;

public class ServerImplementation extends UnicastRemoteObject implements ServerInformation{
    public ServerImplementation() throws RemoteException
    {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        System.out.println("Server handling information...");
    }
    public String printReport(Report r) throws RemoteException
    {
        String string_report = "";
        try
        {
            string_report += "Student: "+r.student+"\n";
            string_report += "Grades: "+r.grades+"\n";
            string_report += "Total count of misses: "+r.misses+"\n";
            string_report += "Characteristics: "+r.checkMissess();
        }
        catch(Exception e)
        {
            System.out.println("Exception "+e.getMessage());
        }
        return string_report;
    }
}
Main
Код:
package rmiserver;
import java.rmi.registry.*;
import java.rmi.*;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        System.getProperties().setProperty("java.rmi.server.hostname","127.0.0.1");
        System.getProperties().setProperty("java.rmi.server.codebase","file:/C:\\Users\\Матвей\\Documents\\NetBeansProjects\\RMIServer\\build\\classes\\");
        System.getProperties().setProperty("java.security.policy","C:\\Users\\Матвей\\Documents\\NetBeansProjects\\RMIServer\\src\\rmiserver\\java.policy");
        try
        {
            ServerImplementation server = new ServerImplementation();
            System.out.println(server);
            //Registry reg = LocateRegistry.getRegistry(1099);
            Naming.rebind("rmi://127.0.0.1:1099/AddServer", server);
            //System.out.println(reg);
            System.out.println("rebinded to AddServer");
        }
        catch(Exception e)
        {
            System.out.println("Exception "+e);
        }
    }
}
java.policy
Код:
grant {
    permission java.net.SocketPermission "*:1024-65535",
        "connect,accept";
    permission java.io.FilePermission
        "C:\\Users\\Матвей\\Documents\\NetBeansProjects\\RMIServer\\build\\classes\\-", "read";
    permission java.io.FilePermission
        "C:\\Users\\Матвей\\Documents\\NetBeansProjects\\RMIClient\\build\\classes\\-", "read";
};
Клиент
Главный
Код:
package rmiclient;
import java.rmi.registry.*;
import java.rmi.*;
import java.net.InetAddress;
import rmiserver.ServerInformation; //тут я запаковал серверные интерфейсы
import rmiserver.Report;

public class LocalClient {
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Registry registry;
        System.getProperties().setProperty("java.rmi.server.codebase","file:/C:\\Users\\Матвей\\Documents\\NetBeansProjects\\RMIClient\\build\\classes");
        System.getProperties().setProperty("java.security.policy","C:\\Users\\Матвей\\Documents\\NetBeansProjects\\RMIClient\\src\\rmiclient\\java.policy");
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        try
        {
            String serverURL = "rmi://127.0.0.1:1099/AddServer";
            System.out.println(serverURL);
            Report sga = new Report("Galchenko Sergey", "5 5 3 4 3", 30);
            //registry = LocateRegistry.getRegistry("127.0.0.1", 1099);
            //System.out.println(registry);
            ServerInformation sI = (ServerInformation)Naming.lookup(serverURL);
            System.out.println(sI);
            System.out.println("Report: \n"+sI.printReport(sga));
        }
        catch(Exception e)
        {
            System.out.println("Exception "+e);
        }
    }
}
Перекопал весь инет, нигде толкового ответа не нашел.

ПыСы: класс Report объявлен как Serializable если что.
ПыПыСы: rmiregistry тоже запущен.

Последний раз редактировалось MaTBeu; 07.02.2010 в 16:41.
MaTBeu вне форума
Старый 07.02.2010, 21:03   #2
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Выложите содержимое класса Naming.

Давно уже с RMI не работал, но явных ошибок не увидел.

в принципе, можете сравнить последовательность действий с этим мануалом:

http://javatalks.ru/ftopic8059.php
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума
Старый 07.02.2010, 22:09   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Класс Naming - это стандартный. java.rmi.Naming, он представляет собой rmi-реестр.
Подобных этому мануалов уже перечитал достаточно. У меня проблема либо с адресами, либо с сервером.
Исключение я получаю при попытке вызвать удаленный метод, а не при попытке получить заглушку серверного интерфейса.

Последний раз редактировалось MaTBeu; 07.02.2010 в 22:11.
MaTBeu вне форума
Старый 07.02.2010, 23:07   #4
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Подобных этому мануалов уже перечитал достаточно.
Понимаю, но тот пример работающий, сам разворачивал его, когда RMI осваивал, плюс он очень короткий
Цитата:
Сообщение от MaTBeu Посмотреть сообщение
У меня проблема либо с адресами, либо с сервером.
Исключение я получаю при попытке вызвать удаленный метод, а не при попытке получить заглушку серверного интерфейса.
Вы дали не весь стек ошибок. но...

Покопался в исходниках апи.
Соединение может быть потеряно в нескольких случаях:
1. оно вообще не было установлено(зависимости в апи уводят в проприетарные либы, так что не известно как там реализовано, и используется ли проксинг интерфейсов.)
2. сбой на серваке, после установки соединения оно сразу падает - и при вызове метода интерфейса в клиенте, монитор объекта вызывает исключение.
3. сбой на серваке, попытка выполнения реализации интерфейса приводит к deadloop или иной, не явной, ошибке, как следствие сервер долго не отвечает - клиент считает что соединения утеряно.


и еще, как бы глубоко я не лез, не смог найти место, где бы производился экспорт реализации интерфейса, только лишь передачу ссылок на него в глубину.

К сожалению, времени на детальное изучение проблемы нету.

Порекомендую вот что: при обучении не юзать облегчающие классы(тут это Naming) вообще(сокращаете код на 2-3 строчки, в итоге можете получить баги которые будете вылавливать дни), и примеры раскуривать в режиме от легкого к сложному.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума
Старый 07.02.2010, 23:35   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
1. оно вообще не было установлено(зависимости в апи уводят в проприетарные либы, так что не известно как там реализовано, и используется ли проксинг интерфейсов.)
Ну тут я уж никак его не проверю, так что может быть.
Цитата:
2. сбой на серваке, после установки соединения оно сразу падает - и при вызове метода интерфейса в клиенте, монитор объекта вызывает исключение.
Сервак работает как глухонемой - никаких исключений или ошибок.
Цитата:
3. сбой на серваке, попытка выполнения реализации интерфейса приводит к deadloop или иной, не явной, ошибке, как следствие сервер долго не отвечает - клиент считает что соединения утеряно.
Не думаю, что при выполнении вывода на экран получается deadloop, но может быть...
Цитата:
и еще, как бы глубоко я не лез, не смог найти место, где бы производился экспорт реализации интерфейса, только лишь передачу ссылок на него в глубину.
Если серверный объект наследует класс UnicastRemoteObject, то экспорт объекта производится автоматически при его создании. Но это не суть важно. Я пробовал вызывать exportObject серверного интерфейса на любой порт - результат тот же.
Цитата:
Порекомендую вот что: при обучении не юзать облегчающие классы(тут это Naming) вообще(сокращаете код на 2-3 строчки, в итоге можете получить баги которые будете вылавливать дни), и примеры раскуривать в режиме от легкого к сложному.
Спасибо за совет, однако я перед этим юзал java.rmi.Registry - создавал реестр, получал по имени хоста и искал на нем заглушку серверного интерфейса - разницы никакой - получаем объект-заглушку и при попытке вызова серверного метода получаем connection timed out.

Лог сервера
Код:
Server handling information...
ServerImplementation[UnicastServerRef [liveRef: [endpoint:[127.0.0.1:11588](local),objID:[-11d09cd3:126aa21a9c6:-7fff, 6984701093079850658]]]]
RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[109.167.47.116:2000](remote),objID:[0:0:0, 0]]]]
rebinded to AddServer
Получили серверный объект и объект-заглушку реестра, сделали rebind
Стек ошибок клиента
Код:
AddServer
RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[109.167.47.116:2000](remote),objID:[0:0:0, 0]]]]
ServerImplementation_Stub[UnicastRef [liveRef: [endpoint:[127.0.0.1:11588](remote),objID:[-11d09cd3:126aa21a9c6:-7fff, 6984701093079850658]]]]
java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
Exception java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
        java.net.ConnectException: Connection timed out: connect
        java.net.ConnectException: Connection timed out: connect
        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.invoke(UnicastRef.java:128)
        at rmiserver.ServerImplementation_Stub.printReport(Unknown Source)
        at rmiclient.LocalClient.main(LocalClient.java:37)
Caused by: java.net.ConnectException: Connection timed out: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:310)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:176)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:163)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:154)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:380)
        at java.net.Socket.connect(Socket.java:569)
        at java.net.Socket.connect(Socket.java:519)
        at java.net.Socket.<init>(Socket.java:416)
        at java.net.Socket.<init>(Socket.java:199)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        ... 5 more
BUILD SUCCESSFUL (total time: 42 seconds)
Как видите мы получили обе заглушки - серверного объекта и реестра, затем идет вызов серверного метода через полученную заглушку и получается исключение.

ПыСы: rmiregistry запущен на 2000 порту если что.
ПыПыСы: и еще - пробовал упрощать вызываемый метод, делал просто чтобы он возвращал строку - результата нет.

Последний раз редактировалось MaTBeu; 07.02.2010 в 23:39.
MaTBeu вне форума
Старый 08.02.2010, 00:31   #6
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
ПыСы: rmiregistry запущен на 2000 порту если что.
Не понял... вы запускаете сервер на 2000 порту, а биндитесь на 1099?
Удивлен... не знал что такое возможно в RMI - распределять интерфейсы по портам.
Цитата:
Сообщение от MaTBeu Посмотреть сообщение
ПыПыСы: и еще - пробовал упрощать вызываемый метод, делал просто чтобы он возвращал строку - результата нет.
На сколько я помню, там у интерфейса должен возвращаться или void или Object-объект. помню что были с этим косяки, а вот какие именно не помню.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума
Старый 08.02.2010, 16:39   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Нет, бинд происходит тоже на 2000 порту. Это я просто менял код, думая, что проблема в порту.
Цитата:
Удивлен... не знал что такое возможно в RMI - распределять интерфейсы по портам.
В RMI можно делать exportObject на любой порт, так же как и rmiregistry запускать на любом порту.
Цитата:
На сколько я помню, там у интерфейса должен возвращаться или void или Object-объект. помню что были с этим косяки, а вот какие именно не помню.
У интерфейса возвращается строка, но передается она в запакованном виде с сервера. Заглушка его распаковывает и выводит как обычную строку.

Кстати, сервер нормально регистрируется в реесте. Я написал небольшую программку, которая проверяет все объекты, зарегистрированные в реестре. Сервер там есть, а вот почему к нему не доходит соединение я не пойму.
MaTBeu вне форума
Старый 10.02.2010, 18:02   #8
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
В RMI можно делать exportObject на любой порт, так же как и rmiregistry запускать на любом порту.
То что реестр можно запускать на любом порту и ежу понятно, я не знал что можно экспортировать объект на другой порт, отличный от порта реестра. как с текущим проектом разберусь и если будет время, покурю rmi по-глубже.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума
Старый 10.02.2010, 22:38   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Нет смысла курить его больше. Проблема решена. Во всем виновата Windows 7. Она сильно тормозит работу как сервера так и клиента. И при подключении просто истекает таймаут ожидания подтверждения. Как увеличить таймаут я не знаю. К тому же я не думаю, что в Vista и Win 7 полноценно реализована поддержка RMI. Но я покопаю немного глубже и если что, отпишусь сюда.

Запустил на Win XP - все работает как надо.
Если кому нужны исходники - мне в ЛС.
MaTBeu вне форума
Старый 11.02.2010, 06:12   #10
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Нет смысла курить его больше.
Дак я для себя


По скольку проблема решена, тему закрываю.

upd By MaTBeu
Проблема решена. В win 7 нужно отключить службу базовой фильтрации. В Vista не пробовал, но там вообще стоит какая-то защита на сокетах, вылетает при создании сокета. Если что-то будет ясно с Vista, напишу сюда.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось MaTBeu; 09.03.2010 в 13:03.
alexinspir вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Remote Desktop Connection BlincAttack Общие вопросы .NET 1 23.10.2009 00:05
connection closed gracefully_помогите! JAy_D Работа с сетью в Delphi 11 17.10.2009 09:23
SocketError 10061. Connection refused Lanist Работа с сетью в Delphi 11 17.07.2008 14:47
Connection timed out при вызове IdSMTP1.Connect(10000); dimon000 Работа с сетью в Delphi 3 11.01.2008 22:49
Connection timed out - что это? илья too Работа с сетью в Delphi 4 25.08.2007 19:07