Avatar billede coolioclm Nybegynder
13. maj 2002 - 23:02 Der er 12 kommentarer og
1 løsning

RMI med Applets

Jeg kan ikke få kommunikation med RMI til at virke når jeg bruger applets som brugergrænseflade.
Jeg får en: no protokol exception.
Hvis jeg fjerner GUI og bare kører programmet uden, så det startes med en main metode, kører det fint.

Kan RMI og Applets ikke køre sammen?

Her er exceptionen:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.net.MalformedURLException: no protocol: and

java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.net.MalformedURLException: no protocol: and

java.net.MalformedURLException: no protocol: and

    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:245)

    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:220)

    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:122)

    at RemoteGameFacade_Stub.joinGame(Unknown Source)

    at RemotePlayerProxy.joinGame(RemotePlayerProxy.java:23)

    at GameApplet.init(GameApplet.java:31)

Avatar billede lyhr007 Nybegynder
14. maj 2002 - 08:42 #1
Det kan godt virke sammen.

Hvilken maskine prøver dine applets at joine?

Samme server som de blev hentet fra, eller en anden maskine?

Og må vi se lidt kode?
Avatar billede lyhr007 Nybegynder
14. maj 2002 - 08:50 #2
På udenlandsk men det går nok:

6.1 If you encounter a problem running your RMI server
The first problem you might encounter is the receipt of a ClassNotFoundException when attempting to bind or rebind a remote object to a name in the registry. This exception is usually due to a malformed codebase property, resulting in the registry not being able to locate the remote object's stubs or other classes needed by the stub.

It is important to note that the remote object's stub implements all the same interfaces as the remote object itself, so those interfaces, as well as any other custom classes declared as method parameters or return values, must also be available for download from the specified codebase.

Most frequently, this exception is thrown as a result of omitting the trailing slash from the URL value of the property. Other reasons would include: the value of the property is not a URL; the path to the classes specified in the URL is incorrect or misspelled; the stub class or any other necessary classes are not all available from the specified URL.

The exception that you may encounter in such a case would look like this:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: examples.callback.MessageReceiverImpl_Stub
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: examples.callback.MessageReceiverImpl_Stub
java.lang.ClassNotFoundException: examples.callback.MessageReceiverImpl_Stub
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Compiled Code)
    at sun.rmi.transport.StreamRemoteCall.executeCall(Compiled Code)
    at sun.rmi.server.UnicastRef.invoke(Compiled Code)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Compiled Code)
    at java.rmi.Naming.rebind(Compiled Code)
    at examples.callback.MessageReceiverImpl.main(Compiled Code)
RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: examples.callback.MessageReceiverImpl_Stub
Avatar billede coolioclm Nybegynder
14. maj 2002 - 13:11 #3
Jeg har fået det til at virke med Win98 men ikke med WinXP....mærkeligt !
Her er koden:

Client (Facaden til Client):

public void joinGame()
    {
        try
        {
            System.setSecurityManager(new RMISecurityManager());
            System.setProperty("java.security.policy", "client.policy");
            gameServer = (GameFacade)Naming.lookup
                  ("rmi://"+serverName+"/GameServer");
            gameServer.joinGame(this);
        }

Client Applet:

public void init()
    {       
        try
        {
            rpp = new RemotePlayerProxy();
           
        }
        catch(RemoteException re)
        {
            re.printStackTrace();
        }
        rpp.joinGame();       
        setLayout(null);
        addNotify();
        resize(487,525); // størrelsen på applet
        QuitButton = new java.awt.Button("Leave Game");
        QuitButton.reshape(372,468,58,26);
        QuitButton.setForeground(Color.black);
        QuitButton.setBackground(Color.gray);
          QuitButton.addActionListener(this);
        add(QuitButton);
        startButton = new java.awt.Button("Join Game");
        startButton.reshape(60,468,58,26);
        startButton.setForeground(Color.black);
        startButton.setBackground(Color.gray);
          startButton.addActionListener(this);
        add(startButton);
        requestFocus();
    }

Server siden:

try
        {
            gameServer = new RemoteGameFacade();
            Naming.rebind("GameServer",gameServer);
        }
Avatar billede lyhr007 Nybegynder
14. maj 2002 - 13:16 #4
Hvis det virker i på den ene er det jo nok ikke koden, så er det sikkert et opsætningsproblem.

Hvis det den samme server og clienterne der kører WinXp og Win98 ?
Så ville jeg kigge efter om:

- Er du sikker på at du kører med den samme JRE?
- Er du sikker på at din security fil (client.policy)er på begge maskiner?
Avatar billede coolioclm Nybegynder
14. maj 2002 - 13:19 #5
Det er helt sikker samme JRE, og client Policy filen er den samme og ligger begge steder.

Server og client ligger pt på samme maskine.
Avatar billede lyhr007 Nybegynder
14. maj 2002 - 13:28 #6
Virker det hvis du flytter server og client på hver sin maskine?

prøv med win98 som både server og client og winxp som både server client.

hvad kommer der til at stå her:
... ("rmi://"+serverName+"/GameServer");

prøv at System.out den..
Avatar billede coolioclm Nybegynder
14. maj 2002 - 13:36 #7
Dette kommer der til at stå: RemoteGameFacade_Stub[RemoteStub [ref: [endpoint:[172.17.10.103:1447](remote),objID:[1bd03e:edcec0878f:-8000, 0]]]]

Der er stadigvæk ikke tilgang til server fra en applet, fra win Xp
Avatar billede lyhr007 Nybegynder
14. maj 2002 - 13:40 #8
Er windows XP maskinen i dit lokal netværk eller connecter den via internettet?

Virker det heller ikke hvis både server og client kører på Windows XP makinen og du connecter til localhost?
Avatar billede coolioclm Nybegynder
14. maj 2002 - 13:46 #9
Har prøvet også med server og client på samme XP maskine.

Har også prøvet med localhost. Og intet virker stadigvæk.

XP maskine er på lokal netværk.
Avatar billede lyhr007 Nybegynder
14. maj 2002 - 14:03 #10
hmmm

Jeg er løbet tør for gode idéer.

Du kan måske prøve at lave en simple RMI applet der kun sakker med den server den kommer fra. Så er der lidt mindre fejl muligheder.
Avatar billede soelvpil Nybegynder
14. maj 2002 - 18:20 #11
Fejlbeskeden har noget med protokol at gøre.

Jeg mener at standarden her (det er vel ikke specielt for applets??)
er ikke at angive nogen protokol (og jeg tror nok, der så i kommunikationen bliver brugt http nedenunder).

Prøv at slette rmi:  i urlen, og se, hvad besked der så kommer
Avatar billede coolioclm Nybegynder
30. august 2002 - 09:20 #12
Lukker spørgsmål, fandt selv ud af det !!!!
Avatar billede soelvpil Nybegynder
30. august 2002 - 16:56 #13
Hvad var problemet?

Når nu flere folk har brugt af deres tid i et forsøg på at hjælpe dig, skylder du vel en lidt nærmere forklaring på, hvad problemet (og løsningen) var.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester