Avatar billede trenskow Nybegynder
29. november 2004 - 21:32 Der er 18 kommentarer og
1 løsning

Hjælp til RMI, og hvordan

Hejsa allesammen

Nu har jeg kigget på RMI, og prøvet at lege med det et stykke tid.
Jeg skal bruge det til vores 3-4 semesters projekt på datamatiker uddannelsen.
Vores projekt er et kortspil som skal spilles over netværk.
Og der skal sendes og modtages, både fra serveren og klienten.
Er RMI det rigtige valg, eller skal jeg vælge sockets istedet for.
Det som jeg har store problemer med, er RMI delen.
I vores projekt har vi lavet langt størstedelen af koden, men det med RMI driller os. Vi har en controller klasse hvor der er de metoder som der skal kaldes, men hvordan kalder jeg dem over netværket. Det kan jeg ikke rigtig finde ud.
Jeg har rodet meget med feks en ServerImpl, en Server og så en test klasse ved siden af. Men jeg kan ikke hitte ud af det. Ikke det med Impl klassen, men det med Naming.rebind og hvad der skal stå der.....
Avatar billede arne_v Ekspert
29. november 2004 - 21:39 #1
Jeg er sikker på at I godt kan bruge RMI til det.

RMI indkapsler skrive/læse til/fra socket om metode kald og vil
derfor ofte give mindre kode.

RMI har glimrende support for callback (hvor serveren kalder client).

Hvad er det præcist ved RMI som driller ?

Og har I f.eks. læst mine 2 artikler om RMI ?
Avatar billede arne_v Ekspert
29. november 2004 - 21:40 #2
http://www.eksperten.dk/artikler/25
http://www.eksperten.dk/artikler/225

(men ellers er der jo skrevet meget om RMI gennem årene)
Avatar billede trenskow Nybegynder
29. november 2004 - 22:53 #3
takker... jeg havde set den første af dine artikler, men ikke den om RMI avanceret. Jeg tror det løser mine problemer, ellers vil jeg lige smide et spørgmål mere i denne tråd.

Hvis du lige smider et svar, så skal du få point.
Avatar billede trenskow Nybegynder
29. november 2004 - 22:54 #4
Det som der præcist driller, er noget med at klienten, skal kunne sende til serveren også, men mon ikke jeg kan hitte ud af det efter dine artikler.
Avatar billede arne_v Ekspert
29. november 2004 - 22:54 #5
svar
Avatar billede arne_v Ekspert
29. november 2004 - 22:54 #6
Den sidste har eksempel på brug af callback
Avatar billede arne_v Ekspert
29. november 2004 - 22:55 #7
Jeg antog at din sidste kommentar gik på at server skulle sende til client ...
Avatar billede trenskow Nybegynder
29. november 2004 - 22:59 #8
Jow, altså, server skal det meste af tiden sende til klient. Men den skal også kunne modtage fra klient på nogle tidspunkter, uden den har spurgt klienten om data.
Avatar billede arne_v Ekspert
29. november 2004 - 23:01 #9
Umiddelbart tror jeg at det vil passe bedst hvis X clients connecter
til 1 RMIRegistry/Server, at clients sender normalt til server og at
server sender til lient via callback.
Avatar billede trenskow Nybegynder
29. november 2004 - 23:04 #10
ja, det tror jeg også efter at have set din artikel om RMI avanceret. Så jeg glæder mig til at skal kigge på det imorgen.
Avatar billede trenskow Nybegynder
01. december 2004 - 00:40 #11
så har jeg fået leget med det, og jeg tror jeg har fundet den gyldne vej :-)
Men jeg har lidt problemer med at teste det.
Jeg smider kun koden til serveren i første omgang, for det er her jeg har problemet.

package common;
import java.rmi.*;

public interface MyServer extends Remote{
public void join(MyClient c, int ip, String Alias) throws RemoteException;
public void unJoin(MyClient c) throws RemoteException;
public void inviterSpiller(String spiller) throws RemoteException;
}
---------------------------------------------------------------------------

package server;
import java.rmi.*;
import java.rmi.server.*;
import common.MyClient;
import common.MyServer;


public class MyServerImpl extends UnicastRemoteObject implements MyServer{
  ControllerServer cs = new ControllerServer();
  public MyServerImpl() throws RemoteException{
  }
  public void join(MyClient c, int ip, String alias) throws RemoteException
  {
    cs.join(c, ip, alias);
  }
  public void unJoin(MyClient c) throws RemoteException
  {
    cs.unjoin(c);
  }
  public void inviterSpiller(String alias)
  {
    cs.inviterSpiller(alias);
  }

}

--------------------------------------------------------------------------
package server;
import java.io.IOException;
import java.net.Socket;
import java.net.ServerSocket;
import java.rmi.server.RMISocketFactory;

public class FixedPortRMISocketFactory extends RMISocketFactory{
  private static int socketNumber = 60000;
  // lav normal udgående socket
  public Socket createSocket(String host, int port) throws IOException
  {
    System.out.println("Connection port : " + port);
    return new Socket(host, port);
  }

  public ServerSocket createServerSocket(int port) throws IOException
  {
    if(port == 0)
    {
      socketNumber++;
      port = socketNumber;
    }
    System.out.println("Listening port : " + port);
    return new ServerSocket(port);
  }
}


-----------------------------------------------------------------------------------

package server;
import client.ClientMain;
import server.ServerMain;

public class TestServer {
  public static void main(String[] args)
  {
    ServerMain srv = new ServerMain();
  }
}

------------------------------------------------------------------------------------

Jeg har ingen problemer med at kompile det, men jeg vil prøve at køre det, så går jeg som beskrevet i din artikel.

Jeg har lavet en build bat som kører uden problemer.
Men når jeg laver server.bat og kører den, får jeg denne fejl
"Exception in thread "main" java.lang.NoClassDefFoundError:"

og jeg har også prøvet at køre den fra jbuilder, og der siger den det her

java.security.AccessControlException: access denied (java.lang.RuntimePermission setFactory)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:269)
    at java.security.AccessController.checkPermission(AccessController.java:401)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:524)
    at java.lang.SecurityManager.checkSetFactory(SecurityManager.java:1587)
    at java.rmi.server.RMISocketFactory.setSocketFactory(RMISocketFactory.java:98)
    at server.ServerMain.<init>(ServerMain.java:28)
    at server.TestServer.main(TestServer.java:16)
Exception in thread "main"


Desuden... hvor skal den socket.policy fil ligge? i samme bibliotek som class filerne til server?
Avatar billede arne_v Ekspert
01. december 2004 - 08:05 #12
java.security.AccessControlException: access denied (java.lang.RuntimePermission setFactory)

min socket.policy indeholder

permission java.lang.RuntimePermission "setFactory";
Avatar billede arne_v Ekspert
01. december 2004 - 08:05 #13
Det er ligegyldigt hvor socket.policy ligger du angiver bare fuld sti:

-Djava.security.policy=C:/dir1/dir2/dir3/socket.policy
Avatar billede trenskow Nybegynder
01. december 2004 - 09:32 #14
Oki. Når jeg nu kører min server.bat så får jeg den her fejl.

Exception in thread "main" java.lang.NoClassDefFoundError: c:\projekt\kortspil\src\server/jar

kan den ikke finde min TestServer hvori jeg har min main?

undskyld hvis jeg bliver ved med at spørge.
Avatar billede trenskow Nybegynder
01. december 2004 - 09:36 #15
min server.bat ser forresten ud, sådan her

rem Angiv classpath til jar filrem Angiv policy fil
rem Angiv serverens eksterne navn
c:\j2sdk1.4.2_04\bin\java c:\projekt\kortspil\src\server.jar 

-Djava.security.policy=c:\projekt\kortspil\src\socket.policy-Djava.rmi.server.hostname=xxx.domain.dk server.TestServer
Avatar billede arne_v Ekspert
01. december 2004 - 10:18 #16
Mangler der ikke en -classpath ??

c:\j2sdk1.4.2_04\bin\java -classpath c:\projekt\kortspil\src\server.jar  -Djava.security.policy=c:\projekt\kortspil\src\socket.policy -Djava.rmi.server.hostname=xxx.domain.dk server.TestServer
Avatar billede trenskow Nybegynder
01. december 2004 - 10:41 #17
der sneg sig en ligge fejl ind da jeg skrev om min server.bat ligefør. Noget med tekstombrydning og notepad :-)
men sådan her ser den ud, og jeg kan ikke lige forstå hvad du mener med -classpath mellem <sti>\java og <sti>\server.jar

rem Angiv classpath til jar fil
rem Angiv policy fil
rem Angiv serverens eksterne navn
c:\j2sdk1.4.2_04\bin\java c:\projekt\kortspil\src\server.jar -Djava.security.policy=c:\projekt\kortspil\src\socket.policy -Djava.rmi.server.hostname=xxx.domain.dk server.TestServer
Avatar billede arne_v Ekspert
01. december 2004 - 10:44 #18
Den korrekte syntax er:

\javadir\bin\java -classpath \jardir\noget.jar -Dnoget=noget -Dnoget=noget pakke.Klasse

der skal en -classpath foran angivelsen af jar filen
Avatar billede trenskow Nybegynder
01. december 2004 - 10:50 #19
arh... dumme mig :-) takker igen mange gange.

Nu fik jeg så en masse fejl bagefter, men jeg kigger på det.
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