Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > изучаю RMI


Автор: chaos 2.4.2009, 07:59
День добрый!
Прочитал у Эккеля главу посвященную RMI. решил опробовать, но столкнулся с проблемами :(


последовательность моих действий:

ICar.java
Код

import java.rmi.*;
import java.awt.Color;

public interface ICar extends Remote {
    String getName() throws RemoteException;
    Color getColor() throws RemoteException;
}


Код

javac ICar.java


CarSrv.java
Код

public class CarSrv extends UnicastRemoteObject implements ICar {
    public final String NAME = "Mercedes-Benz C200";
    public final Color COLOR = Color.BLACK;

    public CarSrv() throws RemoteException {
    }

    public String getName() throws RemoteException {
        return NAME;
    }

    public Color getColor() throws RemoteException {
        return COLOR;
    }

    public static void main(String[] args) throws Exceptions {
        System.setSecurityManager(new RMISecurityManager());
        CarSrv srv = new CarSrv();
        Naming.rebind("rmi://penguin/CarSrv", srv);
    }
}


Код

javac CarSrv.java


Код

rmic CarSrv


в результате получается только CarSrv_Stub.class, а Эккель пишет что еще должен скелет получится :(
при запуске
Код

java CarSrv

вываливается:
Код

Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission penguin resolve)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
    at java.security.AccessController.checkPermission(AccessController.java:553)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkConnect(SecurityManager.java:1048)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1188)
    at java.net.InetAddress.getAllByName(InetAddress.java:1127)
    at java.net.InetAddress.getAllByName(InetAddress.java:1063)
    at java.net.InetAddress.getByName(InetAddress.java:1013)
    at java.net.InetSocketAddress.<init>(InetSocketAddress.java:142)
    at java.net.Socket.<init>(Socket.java:198)
    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)
    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.newCall(UnicastRef.java:340)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Naming.java:177)
    at CarSrv.main(CarSrv.java:16)


В чем моя проблема?

Заранее благодарен!


PS rmiregistry запущен
Код

chaos@penguin:/home$ pgrep rmiregistry
2526

Автор: ivg 2.4.2009, 12:29
Цитата(chaos @  2.4.2009,  09:59 Найти цитируемый пост)
в результате получается только CarSrv_Stub.class, а Эккель пишет что еще должен скелет получится :(

Это уже устарело всё. Лучше читать документацию из JDK. Скелетоны устарели вааще давно.smile Стабы для Java 5.0+ тоже не нужны.

Цитата(chaos @  2.4.2009,  09:59 Найти цитируемый пост)
вываливается:

надо убрать 17-ю строку:
Код

        System.setSecurityManager(new RMISecurityManager());
 это для клиента и, по моему, тоже устарело.

Автор: chaos 3.4.2009, 09:22
почитал сановские маны(в топку старые книги) и все получилось

Вот что имеем smile
ICar.java
Код

package ru.kononenko.test;

import java.awt.Color;
import java.rmi.*;

public interface ICar extends Remote {
    Color getColor() throws RemoteException;
    String getName() throws RemoteException;
}


CarServer.java
Код

package ru.kononenko.test;

import java.awt.Color;
import java.rmi.registry.*;
import java.rmi.server.*;

public class CarServer implements ICar {
    private final String NAME = "Mercedes-Benz C200";
    private final Color COLOR = Color.BLACK;

    public static void main(String[] args) {
        try {
            CarServer obj = new CarServer();
            ICar stub = (ICar)UnicastRemoteObject.exportObject(obj, 0);

            Registry registry = LocateRegistry.getRegistry();
            registry.rebind("Car", stub);

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

    public Color getColor() {
        return COLOR;
    }

    public String getName() {
        return NAME;
    }
}

CarClient.java
Код

package ru.kononenko.test;

import java.rmi.registry.*;

public class CarClient {
    public static void main(String[] args) {
        try {
            Registry r = LocateRegistry.getRegistry("penguin");
            ICar car = (ICar)r.lookup("Car");
            System.out.println("Car name " + car.getName());
            System.out.println("Car color " + car.getColor());
        }
        catch (Exception e) {
            System.err.print("Client exception " + e.toString());
            e.printStackTrace();
        }
    }
}


Далее 
все скомпилировал
запустил 
Код

rmiregistry &

запустил сервер
Код

chaos@penguin:~/NetBeansProjects/TestRMI/build/classes$ java -classpath $(pwd) 
-Djava.rmi.server.codebase=file:$(pwd)/ ru.kononenko.test.CarServer
Server ready


запустил тестовую апликуху
Код

chaos@penguin:~/NetBeansProjects/TestRMI/build/classes$ java 
-classpath $(pwd) ru.kononenko.test.CarClient
Car name Mercedes-Benz C200
Car color java.awt.Color[r=0,g=0,b=0]



ЗЫ повторюсь - не читайте старые(c неактуальной информацией) книги smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)