RMI w NetBeansie

0

Witam serdecznie! Właśnie zamierzam "tworzyć" programy z wykorzystaniem RMI...Chciałbym wszystko robić w NetBeansie (nie "ręcznie", tzn. z wyk. okna poleceń, bo po co tracić czas)...Znalazłem gdzieś w necie jakiś prosty programik, wklepałem klasy i interfejsy do NetBeansa: oto one:

package rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Product extends Remote
{
String getDescription() throws RemoteException;
}
//////////////////////////////////////////////////////////////////////////

import java.rmi.RMISecurityManager;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ProductClient
{
public static void main(String[] args) throws NamingException
{
System.setProperty("java.security.policy", "client.policy");
System.setSecurityManager(new RMISecurityManager());
String url="rmi://localhost:1099";
try
{
Context namingContext=new InitialContext();
Product c1=(Product) namingContext.lookup(url+"toster");
Product c2=(Product) namingContext.lookup(url+"mikrofalowka");

        System.out.println(c1.getDescription());
        System.out.println(c2.getDescription());
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

}
///////////////////////////////////////////////////////////////////////////////////////////////////

package rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class ProductImpl extends UnicastRemoteObject implements Product
{
private String name;
public ProductImpl(String n) throws RemoteException
{
name=n;
}

public String getDescription() throws RemoteException
{
    return "To ja - "+name+". Kup mnie! ";
}

}
////////////////////////////////////////////////////////////////////////////////////////////

package rmi;

import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ProductServer
{
public static void main(String args[]) throws NamingException, RemoteException
{
try
{
System.out.println("Tworzy implementacje serwera...");

        ProductImpl p1=new ProductImpl("toster");
        ProductImpl p2=new ProductImpl("mikrofalowka");

        System.out.println("Rejestruje utworzone implementacje...");
        Context namingContext=new InitialContext();
        namingContext.bind("rmi:toster", p1);
        namingContext.bind("rmi:mikrofalowka", p2);
        System.out.println("Oczekuje zdalnych wywolan od klientow...");
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

}

Pytanie jest takie: jak to odpalić? W jaki sposób netBeans automatycznie tworzy Stub'y i Skeleton? Jak zrobić żeby to zadziałało? Może ktoś wie jak pliki serwerowe wrzucić na serwer, mam zainstalowanego Apache Tomcat...Bardzo proszę o cenne rady...

0

Użyj anta a dokładnie task rmic który ci stworzy klasy stub i skeleton ;-)

0
System.out.println("Rejestruje utworzone implementacje...");
LocateRegistry.createRegistry(1099); //albo dopisz to i nic wiecej nie trzeba
Context namingContext=new InitialContext();
0

Coś dalej nie działa...Ale jak to odpalić...Normalnie RUN (zielona strzałka?) Chcę zeby to tylko zadzialalo, bez rozdzielania programu (na razie) w rozne miejsca, tzn serwer i klient sa na jednej maszynie...A jak użyc tego task rmic? Dalej nie tworzy mi skeletonow ani Stubow...

0

Jeżeli aplikacja ma sama tworzyć rejestr (LocateRegistry.createRegistry(1099)) to w Netbeans-ie po prostu dajesz Run File na ProductServer.java i następnie to samo na ProductClient.java. Nie ma w tedy potrzeby tworzyć skeletonow ani tych drugich.

Co do wgrania tego na serwer to niech ktoś mądrzejszy się wypowie

0
abe_ napisał(a)

Jeżeli aplikacja ma sama tworzyć rejestr (LocateRegistry.createRegistry(1099)) to w Netbeans-ie po prostu dajesz Run File na ProductServer.java i następnie to samo na ProductClient.java. Nie ma w tedy potrzeby tworzyć skeletonow ani tych drugich.

Co do wgrania tego na serwer to niech ktoś mądrzejszy się wypowie

A wiec robie run File na ProductServer.java: Oto efekty:

run:
Tworzy implementacje serwera...
Rejestruje utworzone implementacje...
javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: rmi.Product]
at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:126)
at com.sun.jndi.toolkit.url.GenericURLContext.bind(GenericURLContext.java:208)
at javax.naming.InitialContext.bind(InitialContext.java:400)
at rmi.ProductServer.main(ProductServer.java:26)
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: rmi.Product
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:120)
... 3 more
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: rmi.Product
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: rmi.Product
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
... 12 more

Teraz robię Run File na ProductClient.java-oto efekty:

run:
java.lang.NumberFormatException: For input string: "1099toster"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:456)
at java.lang.Integer.parseInt(Integer.java:497)
at com.sun.jndi.url.rmi.rmiURLContext.getRootURLContext(rmiURLContext.java:86)
at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:182)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at rmi.ProductClient.main(ProductClient.java:21)
BUILD SUCCESSFUL (total time: 0 seconds)

Dalej nie ma zadnych Stubow ani skeletonow...Nie działa...coś jest jeszcze źle, tylko nie wiem co...

Pierwsza napotkana linia, w której jest błą to ta:
Product c1=(Product) namingContext.lookup(url+"toster");

0

Na bank masz w pakiecie rmi interfejs Product? (plik: Product.java) bo on krzyczy ze go nie widzi. Może po prostu nie jest skompilowany?

Co do klienta to zmień w ProductClient.java:
String url="rmi://localhost:1099";
na
String url="rmi://localhost:1099/";

0
abe napisał(a)

Na bank masz w pakiecie rmi interfejs Product? (plik: Product.java) bo on krzyczy ze go nie widzi. Może po prostu nie jest skompilowany?

Co do klienta to zmień w ProductClient.java:
String url="rmi://localhost:1099";
na
String url="rmi://localhost:1099/";

Dostosowałem się do Twoich wskazowek...Ale rezultat dalej nie jest zadowalający, a Product.java istnieje w moim pakiecie RMI...oto wynik uruchomienia ProductClient.java:

run:
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
at java.net.Socket.connect(Socket.java:513)
at java.net.Socket.connect(Socket.java:469)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:180)
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:595)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:97)
at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:185)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at rmi.ProductClient.main(ProductClient.java:21)
BUILD SUCCESSFUL (total time: 0 seconds)

Natomiast ProductServer.java:

run:
Tworzy implementacje serwera...
Rejestruje utworzone implementacje...
java.rmi.server.ExportException: Port already in use: 1099; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:310)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:218)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:393)
at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:129)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:190)
at sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:92)
at sun.rmi.registry.RegistryImpl.<init>(RegistryImpl.java:78)
at java.rmi.registry.LocateRegistry.createRegistry(LocateRegistry.java:186)
at rmi.ProductServer.main(ProductServer.java:24)
Caused by: java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at java.net.ServerSocket.<init>(ServerSocket.java:97)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createServerSocket(RMIDirectSocketFactory.java:27)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createServerSocket(RMIMasterSocketFactory.java:333)
at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(TCPEndpoint.java:649)
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:299)
... 8 more

Dalej nic...Utworzylem plik client.policy i wrzucilem go tam gdzie mam pliki .java (w katalogu build)...

0

Stawiam ze pozostało tylko wyłączyć tego twojego tomcat-a albo co tam masz odpalonego na porcie 1099 i ProductServer pewnie się odpali. Jak tak do dopiero potem ProductClient

To co ja pisze dotyczy przypadku że serwer działa samoistnie.
Kod z tymi 2 małymi zmianami u mnie się normalnie uruchomił beż żadnych innych modyfikacji w stylu client.policy

0
abe napisał(a)

Stawiam ze pozostało tylko wyłączyć tego twojego tomcat-a albo co tam masz odpalonego na porcie 1099 i ProductServer pewnie się odpali. Jak tak do dopiero potem ProductClient

To co ja pisze dotyczy przypadku że serwer działa samoistnie.
Kod z tymi 2 małymi zmianami u mnie się normalnie uruchomił beż żadnych innych modyfikacji w stylu client.policy

Można jasniej? Tomcat nie jest uruchomiony, jeśli jest komunikat, że serwer 1099 jest zajety, wtedy zmieniam port i dalej jest problem...Nie wiem jak to rozgryzc

0

Poszlo!! Abe - mialeś rację...Tylko, ze tak: ProductServer odpalil w Netbeansie - dziala bez problemu...problem jest teraz z ProductClient...Bledy sa takie:

run:
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
at java.net.Socket.connect(Socket.java:513)
at java.net.Socket.connect(Socket.java:469)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:180)
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:595)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:97)
at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:185)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at rmi.ProductClient.main(ProductClient.java:21)
BUILD SUCCESSFUL (total time: 2 seconds)

Pewnie jakiś drobny kruczek...Ale jaki? Ale pomyslmy...java.security.AccessControlException: access denied ...Dostep zablokowany...Pewnie cos z plikiem client.policy...Moze w zlym miejscu go umiejscowilem? Bo jego tresc jest nastepujaca:

grant
{
permission java.net.SocketPermission
"*:1024-65535", "connect";
};

Macie jakis pomysl?

0

Ok, sam sobie odpowiadam - wszystko zakonczylo sie powodzeniem!!! Dzieki Wam, w szczegolnosci Abe za cenne porady...Problem lezal w zle podanej sciezce do pliku client.policy...Dzieki!

0

Witam.
Podbijam temat bo mam ten sam problem. Korzystam tak samo jak Mateluta z książki Java Core.

Mateluta napisał(a)

Ok, sam sobie odpowiadam - wszystko zakonczylo sie powodzeniem!!! Dzieki Wam, w szczegolnosci Abe za cenne porady...Problem lezal w zle podanej sciezce do pliku client.policy...Dzieki!

Więc tak.
Plik client.policy mam umieszczony w folderze gdzie jest zainstalowana java (tj. java..\security), w folderze w NetBeansie gdzie znajdują się pliki ProductServer ,ProductClient, ProductImpl. To samo podpowiada mi google. Mimo to dalej otrzymuje błąd "access denied".
Napisałeś że problem leżał w zle podanej ścieżce do pliku client.policy . Możesz napisać gdzie podaje się tą ścieżke bo sie pogubiłem...

0

up

1 użytkowników online, w tym zalogowanych: 0, gości: 1