Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие клиент сервер посредствам RMI, Applet faild. 
V
    Опции темы
newObject
Дата 6.7.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



Приложение простое существует сервер к которому обращается клиент, сервер возвращает XML документ, клиент строит таблицу. Взаимодействие пытаюсь реализовать посредствам RMI.
В принцепе проблема заключается в том, что локально все работает, т.е. когда для rebind и lookup пишешь localhost .

интерфейс
Код
package comcor.net_db.com;

import java.rmi.Remote;
import java.rmi.RemoteException;
import org.jdom.Document;

public interface EXRMIInterface extends Remote { 
    public org.jdom.Document getEXRMIDocument() throws RemoteException;
}


сервер 
Код
EXDocumentFabric
    public org.jdom.Document getEXRMIDocument() throws RemoteException {
        System.out.println("Run EXDocumentFabric::getEXRMIDocument");
        return this.createTestDocument();
    }

    public static void main( String[] args ) {
        try{
            if (System.getSecurityManager() == null) {
                System.setSecurityManager(new RMISecurityManager());
            }
            EXDocumentFabric bank = new EXDocumentFabric();
            System.out.println("main 01");
//            String name = System.getProperty( "bankname", "EXRMIDocument");
            String name = "EXRMIDocument";
            Naming.rebind( "rmi://13.0.0.60:1099/"+name, bank );
//            Naming.rebind( "//localhost/"+name, bank );
            System.out.println(name + " открыт и ждет клиентов.");
        }
        catch ( RemoteException re ) { 
            re.printStackTrace();
            System.exit(1);
        }


клиент Апплет  (реализованно что то вроде патеррна фабричный метод)
Код
private EXDocument doc() {
        if(m_doc == null) {
            //m_doc = new EXDocument( EXDocumentFabric.createTestDocument() );
            try{
                String name = "EXRMIDocument";
//                comcor.net_db.com.EXRMIInterface bank = (comcor.net_db.com.EXRMIInterface) Naming.lookup("//"+ m_applet.getCodeBase().getHost() +"/"+name);
                comcor.net_db.com.EXRMIInterface bank = (comcor.net_db.com.EXRMIInterface) Naming.lookup("rmi://13.0.0.60:1099/"+name);
                this.m_doc = new EXDocument( bank.getEXRMIDocument() );
            }
            catch( Exception ex ) { 
               System.out.println("Run GUITableModel::doc Exception 01");
                ex.printStackTrace();
            }


        return m_doc;
    }


файл policy
Код
grant {
    // Allow everything for now
    permission java.security.AllPermission;
};


соотвественно запуск:
java -Djava.rmi.server.codebase=file://.../myclasses/ EXDocumentFabric
appletviewer table.html 
Все замечательно отработало.
Но когда я попробовал поднять Апачи и положить туда и клиента ( Апплет) и сервер, работать перестал, причем места вызовов (rebind и lookup) обложил catch`ми ничего не ловится. Konqueror пишет Applet failed.
java -Djava.rmi.server.codebase=http://13.0.0.60/ -Djava.security.policy=http://13.0.0.60/policy EXDocumentFabric (сервер стартанул)
konqueror http://13.0.0.60/table.html ( клиент ответил  Applet failed)

Потом заметил что нет *_Skel.
Насколько я понял *_Stub является классом заглушкой.
Вопрос: 
   - для чего нужен *_Skel?;
   - нужно ли запускать rmic для класса клиента;
   - что не так.

стоит jdk 1.5 
были проблемы с jdk 1.5 и jdk 1.4
т.е. когда запускал
rmic(jdk 1.4) EXDocumentFabric(имя сервера соответственно)
Выпадал эксепшен.
Потом прочел где то про несовместимость версий и все заработало.
rmic(jdk 1.5) EXDocumentFabric(имя сервера соответственно)

Представлен не весь код.
Код апплета выдран из TableModel, EXDocument является оболочкой для XML документ.  
PM MAIL   Вверх
newObject
Дата 7.7.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



 smile Народ, заметил еще одну проблему.
Дествительно когда запускаешь сервер:
Цитата

java -Djava.rmi.server.codebase=file:/home/User/Projects/ -Djava.security.policy=file:/home/User/Projects/policy comcor.net_db.com.EXDocumentFabric

И клиента:
Цитата

appletviewer ./table.html

Все работает отлично. Но когда запускаешь так:
Цитата

konqueror ./table.html


Выпадает Ексепшен и konqueror пишет Loading Class: comcor.net_db.object.EXDocument (ну это вроде понятно нет доступа класс грузится)
Код

java.security.AccessControlException: access denied (java.net.SocketPermission 13.0.0.60:1099 connect,resolve)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
    at java.security.AccessController.checkPermission(AccessController.java:427)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at org.kde.kjas.server.KJASSecurityManager.checkPermission(KJASSecurityManager.java:64)
    at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
    at java.net.Socket.connect(Socket.java:501)
    at java.net.Socket.connect(Socket.java:457)
    at java.net.Socket.<init>(Socket.java:365)
    at java.net.Socket.<init>(Socket.java:178)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:569)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:306)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:84)
    at comcor.net_db.gui.GUITableModel.doc(GUITableModel.java:45)
    at comcor.net_db.gui.GUITableModel.getRowCount(GUITableModel.java:98)
    at comcor.net_db.gui.TableSorter.getRowCount(TableSorter.java:253)
    at javax.swing.JTable.checkLeadAnchor(JTable.java:2949)
    at javax.swing.JTable.tableChanged(JTable.java:2993)
    at javax.swing.JTable.setModel(JTable.java:2827)
    at javax.swing.JTable.<init>(JTable.java:416)
    at javax.swing.JTable.<init>(JTable.java:356)
    at comcor.net_db.gui.ConcreateTable.<init>(GUITable.java:54)
    at comcor.net_db.gui.GUITable.init(GUITable.java:23)
    at org.kde.kjas.server.KJASAppletStub$RunThread.doState(KJASAppletStub.java:151)
    at org.kde.kjas.server.KJASAppletStub$RunThread.run(KJASAppletStub.java:194)

java.lang.NullPointerException
    at comcor.net_db.gui.GUITableModel.doc(GUITableModel.java:70)
    at comcor.net_db.gui.GUITableModel.getRowCount(GUITableModel.java:98)
    at comcor.net_db.gui.TableSorter.getRowCount(TableSorter.java:253)
    at javax.swing.JTable.checkLeadAnchor(JTable.java:2949)
    at javax.swing.JTable.tableChanged(JTable.java:2993)
    at javax.swing.JTable.setModel(JTable.java:2827)
    at javax.swing.JTable.<init>(JTable.java:416)
    at javax.swing.JTable.<init>(JTable.java:356)
    at comcor.net_db.gui.ConcreateTable.<init>(GUITable.java:54)
    at comcor.net_db.gui.GUITable.init(GUITable.java:23)
    at org.kde.kjas.server.KJASAppletStub$RunThread.doState(KJASAppletStub.java:151)
    at org.kde.kjas.server.KJASAppletStub$RunThread.run(KJASAppletStub.java:194)

Error during state 3
Backtrace: 
java.lang.NullPointerException
    at comcor.net_db.gui.ConcreateTable.<init>(GUITable.java:57)
    at comcor.net_db.gui.GUITable.init(GUITable.java:23)
    at org.kde.kjas.server.KJASAppletStub$RunThread.doState(KJASAppletStub.java:151)
    at org.kde.kjas.server.KJASAppletStub$RunThread.run(KJASAppletStub.java:194)


Про то что appletviewer урезан по самые гланды это да, но что происходит smile .
Просьба, подскажите сами или укажите ресурс где можно прочитать толковую информацию о политике доступа.
Да еще все пишется под ASP Linux 10(Karelia)  и запускается с правами root.
 smile Народ дайте хоть какую нибудь мысль. 
PM MAIL   Вверх
BlodTor
Дата 7.7.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



А аплет в jar упакован или просто .class положил?
Если в jar, подписан он или нет? если не подписан, то попробуй подписать его.
 
PM MAIL   Вверх
newObject
Дата 7.7.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



Нет лежат классами, без jar.
Я както об этом даже не думал, понятно что песочница (Sanbox) может по разному реагировать на апплеты с наличием RMI и без него.
В принцепе потому и попросил указать чего почитать про политику безопасности.
Т.к. в тех книгах что есть кротко упоминается что есть такая и по разному реагирует на приложения с подписью и без нее. smile 
 
PM MAIL   Вверх
newObject
Дата 11.7.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



Вопрос по поводу _Skel снимается т.к. с новыми протоколами в RMI Java 2 SDK скелеты стали не нужны.  smile 
Но насущный ворос "Что не так" отсается.  smile  
PM MAIL   Вверх
powerOn
Дата 11.7.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 2
Всего: 159



Цитата(newObject @  6.7.2006,  14:08 Найти цитируемый пост)
     Naming.rebind( "rmi://13.0.0.60:1099/"+name, bank );


Код регистрации компонента выполняется на стороне сервера. Как собственно и создание компонента. Для сервера адрес сервера (т.е его собственный адрес) - localhost. У тебя же, получается, что с твоей машины нужно на удаленном сервере зарегистрировать компонент. Попробуй регистрацию производить по localhost.

Код

LocateRegistry.createRegistry(port);
Naming.rebind("rmi://localhost:" + port + "/" + serviceName, myRemoteComponent);

 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
newObject
Дата 19.7.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



Народ, покажите в чем ошибка!!!
Я взял пример "Клиентские обратные вызовы RMI" из книги http://ru.sun.com/java/j2ee/book/RMI.pdf
Скомпилил, положил в http (http://13.0.0.60/SunTMN/ все лежит в это директории) и... Все работает СУПЕР!!!
Решил убрать обратные вызовы и перелопатил пример вот так
Applet1.java (клиент)
Код

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.Date;
import java.net.URL;
import java.rmi.*;
import java.rmi.server.*;

public class Applet1 extends Applet {
   private final static String HOST_NAME = "13.0.0.60";

   private TimeMonitor tm;

   public void init() {
      super.init();
      uiInit();

      try {
         System.out.println( "Exporting the Applet" );
         URL     base = getDocumentBase();

         String hostName = base.getHost();

         if ( 0 == hostName.length() ) hostName = HOST_NAME;
         
         String  serverName = "rmi://" + hostName + ":" + "10005" + "/TimeServer" ;
         System.out.println( "Looking up TimeService at: " + serverName );
         try {
            tm = (TimeMonitor)Naming.lookup( serverName );
         } catch ( Exception e ) {
            System.out.println( "" + e );
         }
         for(int i=0; i<10; i++) 
            textArea1.appendText( tm.tellMeTheTime().toString() + "\n" );
         System.out.println( "We have been registered!" );
      } catch ( RemoteException re ) {
         System.out.println( "" + re );
      }
    }

   public void uiInit() {
      setLayout(null);
      resize(456,266);
      textArea1 = new java.awt.TextArea();
      textArea1.reshape(36,24,252,170);
      add(textArea1);

      button1 = new java.awt.Button("Clear");
      button1.reshape(324,36,72,24);
      add(button1);

      button1.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent event) {
               textArea1.setText("");
            }
         }
      );
   }

   java.awt.TextArea textArea1;
   java.awt.Button button1;
}

RMIServer.java (сервер)
Код

import java.net.*;
import java.io.*;
import java.util.Date;

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;

public class RMIServer implements Remote, TimeMonitor {
   private static final int    PORT        = 10005;
   private static final String HOST_NAME   = "localhost";
   // Instance of ourselves
   private static RMIServer  rmi;

   public static void main ( String[] args ) {
      // We need to set the security manager to the RMISecurityManager
      System.setSecurityManager( new RMISecurityManager() );

      try {
         rmi = new RMIServer();

         LocateRegistry.createRegistry( PORT );

         System.out.println( "Registry created" );

         UnicastRemoteObject.exportObject( ((TimeMonitor)rmi) );

         Naming.rebind( "//" + HOST_NAME + ":" + Integer.toString( PORT ) + "/" + "TimeServer", rmi );

         System.out.println( "Bindings Finished" );
         System.out.println( "Waiting for Client requests" );
      } catch ( java.rmi.UnknownHostException uhe ) {
         System.out.println( "The host computer name you have specified, " + HOST_NAME + " does not match your real computer name." );
      }
      catch ( RemoteException re ) {
         System.out.println( "Error starting service" );
         System.out.println( "" + re );
      }
      catch ( MalformedURLException mURLe ) {
         System.out.println( "Internal error" + mURLe );
      }
   }  // main

   public Date tellMeTheTime() throws RemoteException {
      return new Date();
   }

}

TimeMonitor.java (интерфейс)
Код

import java.rmi.*;
import java.util.Date;

// Create the interface TimeMonitor.
// It contains one method tellMeTheTime.
// This method accepts a parameter of type Date
// and returns void.
public interface TimeMonitor extends java.rmi.Remote
{
   public Date tellMeTheTime() throws RemoteException;
   //public String tellMeTheTime() throws RemoteException;
}

файл policy (разрешение доступа)
Код

grant {
    // Allow everything for now
    permission java.security.AllPermission;
};


table.html 
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD><TITLE>TimeMonitor</TITLE></HEAD>
 <BODY 
 topmargin  =0 leftmargin  =0 
 marginwidth=0 marginheight=0
 >
<applet 
MYSCRIPT
code     ="Applet1.class"
name     ="TimeMonitor"

width =800
height=600
>

</applet>
</BODY>
</HTML>

1. Запускаю апачи.
2. Запускаю rmiregistry
3. Скомпилил и создал заглушку
3. Запускаю сервер (java -Djava.secutity.policy=http://13.0.0.60/SunTMN/policy RMIServer)
4. Запускаю клиента (konqueror http://13.0.0.60/SunTMN/table.html)
Все виснет на методе lookup клиента а konqueror говорит гружу класс TimeMonitor!!!
 smile  smile  smile  Че происходит? 
PM MAIL   Вверх
newObject
Дата 20.7.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



Народ, код из последнего поста я замучал, Все хорошо работает.
Преребрался к своему коду, опять не работает!!!
Сервер стартует нормально, а клиент пишет Applet faild (забыл добавить, что апплет не проходит метода lookup(), т.е. на нем все и падает)!
Кто нибудь может сказать по какой причине могут возникать такие сообщения от браузера?
Естественно применительно к ситуации (Апплет клиент)->(сервер).
  

Это сообщение отредактировал(а) newObject - 21.7.2006, 08:03
PM MAIL   Вверх
newObject
Дата 21.7.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 29.6.2006

Репутация: нет
Всего: 2



Это, не реально. У меня нет слов!!!
Рассказываю по порядку
Я забыл указать в первом посте html для запуска моего апплета!
а там были совершенно безобидные строчки
Код

...
code = "..."
name = "..."
width = 90%
height = 90%
...

Запускал konqueror, то пишет Applet Faild. (его электронную маму smile )
Так как до этого локально appletviewer работал а проблемы возникали именно с konqueror, то его постоянно и запускал.
Случайно запустил через appletviewer, и то весело выплюнул 
Цитата

Exception in thread "main" java.util.MissingResourceException: Can't find resource ...

Полез гуглиться и нашел на http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4250410
Цитата

There is also an issue for the AppletViewer when relative
sizes are specified (e.g. width=100% height=50%). In those
cases the HTML works in the browsers but not in the
AppletViewer or JPI.

исправил соответственно значения из процентных на пиксельные!!!  smile 
Далее appletviewer сообщил, что апплет не видит класс org.jdom.Document (класс является возвращаемым значением в RMI интерфейсе).
Пложил в корень апачи org и все ЗАРАБОТАЛО!!!
Вот и думай то ли это моя НЕВНИМАТЕЛЬНОСТЬ то ли нужно ВСПОМНИТЬ ЧЬЮ ТО МАМУ!!!

P.S. to be continued, see next post  smile  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1105 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.