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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по RMI, не хочет конектица к порту. 
:(
    Опции темы
zone51
Дата 27.5.2006, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Товарищи, подскажите пожалста почему написанный мной сервак на RMI в упор не хочет конекцицца к локалхосту.Перепробовал много чего.Спасибо заранее.
Код
import java.rmi.Naming.*;
import java.rmi.registry.Registry;    
import java.rmi.registry.LocateRegistry;
import java.rmi.*;
import java.rmi.server.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;



class sudokuServerImpl extends UnicastRemoteObject implements sudokuServer{

 List<sudokuRemoteImpl> remoteProcessors=new ArrayList<sudokuRemoteImpl>(9);

 //======================================

 public sudokuServerImpl() throws RemoteException
 {
  super();
 };

 //======================================

 public void add(final sudokuRemoteImpl g)
 {

  System.out.println("It`s a adding remote processor");
  remoteProcessors.add(g);
 
 };

 //=======================================

 public void setJob(int[] mas,int pos)
 {
 
  System.out.println("It`s a setJobServer");

 };

 //=======================================

 public void rollback(int num)
 {
  
  System.out.println("It`s a rollbackServer");

 };
 
 //=======================================

 public static void main(String[] args) throws Exception
 {
   
 // JFrame f=new serverlog("Сервер-Лог");

 if (System.getSecurityManager() == null) {    
   System.setSecurityManager(new RMISecurityManager());    
 }    
 String name = "//127.0.0.1:1099/sudokuServer";    

 Registry registry = LocateRegistry.createRegistry(Integer.parseInt("1099", 10));

 try 
 {
  sudokuServer s=new sudokuServerImpl();    
  Naming.rebind(name,s);    
 }
 catch (Exception e) 
 {    
   System.out.println("dddddddddddddddddddd");
   e.printStackTrace();    
 }    
 
 };

};//end of class

Цитата
C:\prog1\Sudoku>java sudokuServerImpl
dddddddddddddddddddd
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
        at java.security.AccessControlContext.checkPermission(Unknown Source)
        at java.security.AccessController.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkConnect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
        at sun.rmi.server.UnicastRef.newCall(Unknown Source)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Unknown Source)
        at sudokuServerImpl.main(sudokuServerImpl.java:69)
  


--------------------
The truth is out there
PM MAIL   Вверх
powerOn
Дата 27.5.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Те неуказываешь протокол в URL 

нужно:
rmi://<host_name> [:<name_service_port>] /<service_name>
к примеру:
Код

Calculator c = new CalculatorImpl(); 
Naming.rebind("rmi://localhost:1099/ CalculatorService", c);


а у тебя name:

Цитата(zone51 @  27.5.2006,  02:55 Найти цитируемый пост)
String name = "//127.0.0.1:1099/sudokuServer";    

 Registry registry = LocateRegistry.createRegistry(Integer.parseInt("1099", 10));



 


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

PM MAIL   Вверх
zone51
Дата 27.5.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



MoonCat, 

Спасибо.

А не подскажете, почему то не срабатывает фрагмент кода
Код
public static void main(String[] args)
 {
  try 
  {
   String name = "sudokuServer";    
   sudokuRemoteImpl pr=new sudokuRemoteImpl();
   sudokuServer server = (sudokuServer)Naming.lookup(name);    
   server.comeon(pr);
  }
  catch (Exception e) 
  {
   e.printStackTrace();    
  }
 }

Хотя метод comeon описан правильно
Код
public void comeon(sudokuRemoteImpl sud)
 {
  f.accessLabel("New Process");
  remoteProcessors.add(sud);
 };

    
Выдает ошибку:

Цитата
C:\prog1\Sudoku>java sudokuRemoteImpl
java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
        at sun.rmi.transport.Transport$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Unknown Source)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
        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 sudokuServerImpl_Stub.comeon(Unknown Source)
        at sudokuRemoteImpl.main(sudokuRemoteImpl.java:49)

Как я тока не крутил,ниче не помогает. Спасибо.

Спасибо огромное. 


--------------------
The truth is out there
PM MAIL   Вверх
powerOn
Дата 27.5.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(zone51 @  27.5.2006,  19:53 Найти цитируемый пост)

{quote]

public static void main(String[] args)
 {
  try 
  {
   String name = "sudokuServer";    
   sudokuRemoteImpl pr=new sudokuRemoteImpl();
   sudokuServer server = (sudokuServer)Naming.lookup(name);    
   server.comeon(pr);
  }
  catch (Exception e) 
  {
   e.printStackTrace();    
  }
 }
    
[/quote]

Я так понимаю это код клиента? 
Сдесь таже ошибка, name должен быть такого вида: rmi://<host_name> [:<name_service_port>] /<service_name>
И зачем вот эта строка: sudokuRemoteImpl pr=new sudokuRemoteImpl();  ?

так попробуй:
Код

   String name = "rmi://127.0.0.1:1099/sudokuServer";    
   sudokuServer server = (sudokuServer) Naming.lookup(name);   



  

Это сообщение отредактировал(а) MoonCat - 27.5.2006, 19:50


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

PM MAIL   Вверх
zone51
Дата 27.5.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уважаемый MoonCat

В общем в этом примере сервер и удаленный объект. У сервера есть метод add(sudokuRemoteImpl), который вызывают удаленные объекты при своем запуске. sudokuRemote-это интерфейс удаленного объекта. вот он
Код
import java.rmi.*;
import java.util.*;
import java.rmi.Naming.*;
import javax.swing.*;
import java.awt.event.*;
import java.rmi.server.*;

public interface sudokuRemote extends Remote{
 public void process(int[] mas,int pos,int num) throws RemoteException;//Задание
}

а sudokuRemoteImpl это его реализация вот она
Код
import java.rmi.Naming.*;
import javax.swing.*;
import java.awt.event.*;
import java.rmi.*;
import java.rmi.server.*;

class sudokuRemoteImpl extends UnicastRemoteObject implements sudokuRemote{ 

 
 sudokuRemoteImpl() throws RemoteException
 {
  super();
 }

 //===========================================

 public static void main(String[] args)
 {
  try 
  {
   String name = "sudokuServer";    
   sudokuRemoteImpl pr=new sudokuRemoteImpl();
   sudokuServer server = (sudokuServer)Naming.lookup(name);    
   server.comeon(pr);
  }
  catch (Exception e) 
  {
   e.printStackTrace();    
  }
 }

 //===========================================

 public void process(int[] mas,int pos,int num)
 {


 }
}//end of class

ну это грубо говоря, самое основное.

И есть сервер, тоже как удаленный объект. вот он
Код
import java.rmi.*;
import java.rmi.server.*;

public interface sudokuServer extends Remote
{
 public void comeon(sudokuRemoteImpl sud)  throws RemoteException;
 public void setJob(int[] mas,int i)        throws RemoteException;
 public void rollback(int num)              throws RemoteException;
}

И реализация вот она
Код
import java.rmi.Naming.*;
import java.rmi.registry.Registry;    
import java.rmi.registry.LocateRegistry;
import java.rmi.*;
import java.rmi.server.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;

//======================================

class servlog extends JFrame{
 JTextArea la;

 servlog(String s){
  super(s);
   setSize(200,300);
    setLayout(null);
    la=new JTextArea("aas");
     la.setBounds(5,10,185,220);
//     la.setSize(200,200);
     setResizable(false);
      getContentPane().add(la);
     addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent ev){
       System.exit(0);
      }
     });
  setVisible(true);
 }
 public void accessLabel(String text){
  la.append(text);
 };

}//end of class remlog

//=======================================
 
class sudokuServerImpl extends UnicastRemoteObject implements sudokuServer{

 List<sudokuRemoteImpl> remoteProcessors=new ArrayList<sudokuRemoteImpl>(9);
 servlog f=new servlog("Сервер-Лог");

 //======================================

 public sudokuServerImpl() throws RemoteException
 {
  super();
 };

 //======================================

 public void comeon(sudokuRemoteImpl sud)
 {
  f.accessLabel("New Process");
  remoteProcessors.add(sud);
 };

 //=======================================

 public void setJob(int[] mas,int pos)
 {

  f.accessLabel("На рассчет отправлено число\n");

 };

 //=======================================

 public void rollback(int num)
 {
  
  f.accessLabel("Получено рассчетное число\n");

 };
 
 //=======================================

 public static void main(String[] args) throws Exception
 {

 String name = "rmi://localhost:1099/sudokuServer";    
 
 try 
 {
  sudokuServer s=new sudokuServerImpl();    
  Naming.rebind(name,s);    
 }
 catch (Exception e) 
 {    
   System.out.println("dddddddddddddddddddd");
   e.printStackTrace();    
 }    
 
 };

};//end of class

В общем удаленный объект запускается на какой то удаленной машине, и в методе main ищет уже запущенный где-то (на локалхосте) сервер, соединяется с ним и вызывает методы. В общем как показали опыты, проблема в том, что глючит механизм вызова этого метода comeon у сервера, с подключением к серверу все нормально. Другие методы, с параметрами int Или другими работают как часы, а этот не хочет в упор. Порылся в нете и нашел это:

Цитата
Однако, при вызове метода sendMail() (строка 12 листинга 10) возникает исключение: "java.lang.IllegalArgumentException: argument type mismatch" (в иных случаях характерен ClassCastException). Почему ?. Дело в том, что интерфейсные классы для компонетов C и М были загружены разными класслоадерами и поэтому с точки зрения JVM они не являются эквивалентными. В данном случае исключение возникает при попытке привести объект интерфейсного класса AddressNode загруженного при помощи codebase класслоадера для С к типу AddressNode но уже загруженного codebase класслоадером для M. Данная ситуация хорошо иллюстрируется схемой загрузчиков классов


Нифига не понял, только что проблема типа серьезная. Подскажите что делать? Спасибо. горю.  


--------------------
The truth is out there
PM MAIL   Вверх
powerOn
Дата 28.5.2006, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Я так понимаю, что ты хочешь передать удаленному компоненту ссылку на свой локальный объект. А удаленный компонент в свою очередь  вызывал бы методы этого объекта, и приэтом, выполнение метода локального объекта происходило на локальной машине. Т.е. передается не сам объект, а ссылка на него. Получается что-то вроде RMI Callback-а. zone51,  я правильно тебя понял?

Если да то вот пример кода позволяющего это сделать. 
Имеется 2 удаленных интерфейса и 2 его реализации, Клиент и Регистратор Удаленного сервиса.

TestInterface1 - интерфейс удаленного компонента.
TestInterface2 - интерфейс компонента которого будем передовать в удаленный метод.
TestInterface1Impl - реализация TestInterface1
TestInterface2Impl - реализация TestInterface2

Registrator- регистратор для TestInterface1Impl.
Client - клиент для TestInterface1Impl (создает объект TestInterface2Impl и передает его удаленному серверу, который в свою очередь вызывает его метод)

Надеюсь, это то что тебе нужно.  

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  src.zip 2,55 Kb


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

PM MAIL   Вверх
zone51
Дата 28.5.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



MoonCat, 

Огромное спасибо, мне действительно помог ваш пример, но у меня тут щас новая фича: в общем по RMI. Короче как осуществить обратную связь удаленных компонент и сервера: То есть сервер посылает на 9 удаленных машин 9 задач, они какое то время работают, может день, может секунду, и как потом этот результат возвратить? банально поставить таймер или есть какие то спецфункции RMI?. Я так думаю: у сервера есть метод посылающий и принимающий. Посылающий  посылает задачу, когда удаленный объект ее решает, то он вызывает принимающий метод сервера и передает ему результат. А в клиенте как? Просто ждать и через какие то промежутки времени проверять решено или нет? Спасибо 


--------------------
The truth is out there
PM MAIL   Вверх
powerOn
Дата 28.5.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(zone51 @  28.5.2006,  01:58 Найти цитируемый пост)
Я так думаю: у сервера есть метод посылающий и принимающий. Посылающий  посылает задачу, когда удаленный объект ее решает, то он вызывает принимающий метод сервера и передает ему результат.

Мне нравится такой вариант. Но он будет работоспособен, если клиент (ждет решения, а сервер - решает задачу) работает на протяжении всего времени решения задачи. Сервер в этом случае мог бы уведомить клиента обратным вызовом. Это серьезно бы сняло нагрузку с сети, поскольку клиенту не пришлось бы постоянно спрашивать у сервера: "Ну что, готово? Ну, готово?...."  smile 

Второй вариант,
Цитата(zone51 @  28.5.2006,  01:58 Найти цитируемый пост)
А в клиенте как? Просто ждать и через какие то промежутки времени проверять решено или нет? 

когда клиент постоянно мучает вопросами сервер о завершенной задачи подойдет, если клиент может отключиться и вернуться через день. Т.е нагрузили сервак задачами, выключили клиента, а через пару часов проверили есть ли результаты.

Тут нужно учесть специфику задачи, особенно длительность её выполнения.

 


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

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

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

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


 




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


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

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