# RMI + Applet - Verbindung nur lokal



## Guest (4. Apr 2007)

Hallo,

habe ein kleines Problemchen mit meinem RMI-Applet.
Lasse ich Server und Client lokal laufen, funktioniert alles.
Sobald ich das Applet jedoch von einem anderen PC starte, bekomme ich keine Verbindung :-(

Der Server:

```
Registry registry;

	  LocateRegistry.createRegistry( Registry.REGISTRY_PORT );
	  registry = LocateRegistry.getRegistry();
	
	  RmiDBImpl dbImpl = new RmiDBImpl();
          RmiDB stub = (RmiDB) UnicastRemoteObject.exportObject( dbImpl, 0 );
          RemoteServer.setLog( System.out );
    
          registry.rebind( "rmi://10.30.1.74/DB", stub );
    
          DbFunctions.connect();
```


Der Client:

```
Registry registry = LocateRegistry.getRegistry();
			myDB = (RmiDB) registry.lookup( "rmi://10.30.1.74/DB" );
```


Die Firewall(s) sind deaktiviert, ich kann das Applet selbst auch vom Server starten - nur die Verbindung zum RMI-Dienst klappt nicht.

Woran kann das noch liegen?

Das Applet ist mit dem Tool aus der FAQ signiert.

Muss ich noch irgendwelche Policies setzen, damit das Applet eine Verbindung zum RMI-Dienst aufbauen darf?

Vielen Dank schon einmal im Voraus für die Hilfe!

Philipp


----------



## L-ectron-X (4. Apr 2007)

Ja, und du musst auch den RMISecurityManager instanziieren.

Die Policy-Datei kann den Namen *rmi.policy* tragen und folgenden Inhalt haben:

```
grant {
   permission java.security.AllPermission;
};
```
Die Policy-Datei muss im Verzeichnis deines RMI-Servers gespeichert sein.

Den RMISecurityManager musst du im Applet, wie im RMI-Server instanziieren. Dazu folgender Code:

```
System.setSecurityManager(new RMISecurityManager());
```
Im RMI-Server kannst du den Aufruf am besten gleich als erste Zeile im Konstruktor positionieren.
Im Applet als erste Zeile in der init()-Methode.

Um die Zugriffsrechte zu garantieren muss nun der Server mit folgendem Befehl gestartet werden:

```
java -Djava.security.policy=rmi.policy -Djava.rmi.server.codebase=http://meine-domain/ -jar RMI-Server.jar
```

Die Firewall brauchst du nicht deaktivieren, es genügt den RMI-Standard-Port 1099 zu öffnen, du hast die RMI-Registry ja auch nur diesen gebunden.

Damit das Applet sich mit dem Rechner verbindet, auf welchem sich der Webserver und die RMI-Registry befinden, hat sich folgender Code bewährt:

```
myDB = (RmiDB)Naming.lookup("//" + getCodeBase().getHost() + "/DB");
```
Diese Zeile ist an Dein Beispiel angepasst.


----------



## Guest (4. Apr 2007)

Super, vielen Dank für die schnelle Antwort!   
Werde ich sofort mal ausprobieren ...


----------



## Maddin28 (5. Apr 2007)

Hi

ich hab so ziemlich das selbe Problem wie mein Kollege "Gast"... lokal geht alles prima, sobald ich im Netzwerk arbeiten möchte, geht die Verbindung nicht mehr. 
Also ich poste mal das gesamte Bsp., hab schon probiert den RMISecurityManager zu implementieren, geht aber irgendwie nicht richtig, ich bekomme immer die Meldung:


```
java.security.AccessControlException: access denied (java.lang.RuntimePermission createSecurityManager)
	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.<init>(Unknown Source)
	at java.rmi.RMISecurityManager.<init>(Unknown Source)
	at index.init(index.java:17)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```

so im Folgenden also das kleine Bsp.

index.java

```
import java.rmi.Naming;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.rmi.RMISecurityManager;
import java.rmi.*;

public class index extends Applet implements MouseListener
{
    
    Panel links, rechts;
	Panel rechtsoben, rechtsunten, gesamt;
    List LstSpiele, LstTische;
    
    public void init(){
    
	    System.setSecurityManager(new RMISecurityManager());
	    LstSpiele = new List(25, false);
		LstSpiele.addMouseListener(this);
		LstSpiele.add("2er Watten");
		LstSpiele.add("4er Watten");
		LstSpiele.add("4er Watten (blind)");
	    
	    LstTische = new List(20, false);
	    LstTische.addMouseListener(this);
		
		int i = 0;
		for (i=0;i<20;i++){
		LstTische.add("Tisch Nr."+i);	
		}
	    
	    gesamt = new Panel();	
	    links = new Panel();
	    rechts = new Panel();
	    rechtsoben = new Panel();
	    rechtsunten = new Panel();	
	    
	    gesamt.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
		//gesamt.setPreferredSize(new java.awt.Dimension(500,400));
	    gesamt.add(LstSpiele);
	    gesamt.add(LstTische);
    
    	add(gesamt);
    
	
	
    }

    public void mouseClicked(MouseEvent e)
    {	
	    if (e.getClickCount() == 2){
	    	try{
	    		ClientImpl neuesfenster = new ClientImpl();
	    		//neuesfenster.setSize(750,700);
	    	//neuesfenster.addWindowListener(new FensterWegAdapter());
	    	neuesfenster.setVisible(true);
	    	}catch(Exception ex){}
	    	

	    }
    }
    public void mousePressed(MouseEvent e)
    {}
    public void mouseReleased(MouseEvent e)
    {}
    public void mouseEntered(MouseEvent e)
    {}
    public void mouseExited(MouseEvent e)
    {}

}
```

ServerImpl.java

```
import java.rmi.server.UnicastRemoteObject;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.util.*;

public class ServerImpl extends UnicastRemoteObject implements ServerInterface {

	private Vector<ClientInterface> clients = new Vector<ClientInterface>();
	
	String test = new String("teststring");
	
	// ...
	public ServerImpl() throws RemoteException{
		System.setSecurityManager(new RMISecurityManager());
	}
	public void registerMe(ClientInterface cli) throws RemoteException {
	
		// Client zum Vektor hinzufï¿½gen
		clients.add(cli);
	
	}

	// ...
	public String gibString(){
		return test;
	}
	public void setzeString(String str){
		test = 	str;
	}
	// notifyClients() ï¿½berall dort aufrufen, wo die Clients benachrichtigt werden sollen
	public void notifyClients() {
	
		for(Enumeration<ClientInterface> items = clients.elements(); items.hasMoreElements(); ) {
		
			ClientInterface c = items.nextElement();
		
			try {
			
				c.NeuZeichnen(); // Client benachrichtigen
				
			} catch (RemoteException e) {
				
				// ups, da is was schief gelaufen
				
				e.printStackTrace();
				
			}
		
		}

	}
	
	public static void main(String args[]) {
		    try {
		      Naming.rebind("//192.168.0.220/Server", new ServerImpl());
		    } catch(Exception ex) {
		      ex.printStackTrace();
		    }
	}
}
```

ClientImpl.java

```
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.rmi.Naming;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ClientImpl extends JFrame implements ClientInterface, MouseListener {

	ServerInterface server;		
	JButton btn_test1, btn_test2;
	JLabel lbl_1, lbl_2, lbl_3, lbl_4;
	int tischid = 1;
	String serverstring = new String("//192.168.0.220/Server");
	
	public ClientImpl() throws RemoteException { // im Konstruktor
		UnicastRemoteObject.exportObject(this, 0);
		btn_test1 = new JButton("Neuzeichnen");
		btn_test1.addMouseListener(this);
		btn_test1.setName("test1");
		btn_test2 = new JButton("WerteSetzen");
		btn_test2.addMouseListener(this);
		btn_test2.setName("test2");
		
		lbl_1 = new JLabel("");
		lbl_1.setVerticalAlignment(JLabel.CENTER);
		lbl_1.setHorizontalAlignment(JLabel.CENTER);
		lbl_1.setPreferredSize(new Dimension(100,40));
		
		//lbl_1.setBackground(Color.BLACK);
		//lbl_1.setOpaque(true);	
		// sich selbst exportieren
		setLayout(new GridLayout(3,1));
		
    	//neuesfenster.addWindowListener(new FensterWegAdapter());
    	setVisible(true);
		add(btn_test1);
		add(btn_test2);
		add(lbl_1);
		
		//UnicastRemoteObject.exportObject(this, 0);
		// ...
		
		try 
        {
      		server = (ServerInterface)Naming.lookup(serverstring);
		    server.registerMe(this);
		      
		} catch(Exception ex) {
			ex.printStackTrace();
		}
		
		// sich selbst beim Server registrieren (kann auch in anderer Methode passieren - Verbindung zum Server muss bereits bestehen)

	}
// ...
	
	public void NeuZeichnen() throws RemoteException{
		
		String nochntest = new String("");
		try 
        {
      		server = (ServerInterface)Naming.lookup(serverstring);
		    nochntest = server.gibString();
		     
		} catch(Exception ex) {
			ex.printStackTrace();
		}
			
		lbl_1.setText(nochntest);
	}
	
	public void mouseClicked(MouseEvent e)
    {	
	    if (("test1").equals(e.getComponent().getName())){
	   		//NeuZeichnen();
	    }
	    if (("test2").equals(e.getComponent().getName())){

	   			//lbl_1.setText(lbl_1.getText() + "G");
	   					
	   			try 
	   	        {
	   	      		server = (ServerInterface)Naming.lookup(serverstring);
	   			    lbl_1.setText("Ausgabe:" + server.gibString());
	   			    server.notifyClients();
	   			      
	   			} catch(Exception ex) {
	   				ex.printStackTrace();
	   			}	
	    }
    }
    public void mousePressed(MouseEvent e)
    {}
    public void mouseReleased(MouseEvent e)
    {}
    public void mouseEntered(MouseEvent e)
    {}
    public void mouseExited(MouseEvent e)
    {}
	
	public static void main(String[] args) {
        
        

	    try{
	    	ClientImpl fenster = new ClientImpl();  
	    	fenster.setSize(300,300);
	    	fenster.setVisible(true); 
	    	
	   	}catch(RemoteException e){
	     	System.out.println("Sorry, the  Customer List is not available");
	  	}

    }
}
```

So...also das Applet (index.java) öffnet Jframes (ClientImpl.java). Das Einzige was passiert, ist, dass beim Klicken auf den 2ten Button eine Variable auf dem Server ausgelesen wird und in jedes der Clients ausgegeben wird. Also wie gesagt, lokal funktioniert das Ganze....gebe ich meine Netzwerk-IP-Adresse ein, nicht mehr.

Bin für jeden Tip dankbar....
Gruß


----------



## L-ectron-X (5. Apr 2007)

Hast du das Applet signiert? In der FAQ liegt ein Tool, mit dem du das ganz einfach erledigen kannst.
Und beim Server muss die oben erwähnte policy-Datei liegen (Was aber nichts mit dem Client zu tun hat).


----------



## Maddin28 (5. Apr 2007)

Hi

danke für die schnelle Antwort...In der Tat, ich hab mein Applet nicht signiert, hab das zwar jetzt schnell probiert, aber die Fehlermeldung kommt trotzdem.
Wie sieht es damit aus, wenn ich das ganze ohne Applet mache, wenn ich also meine Anwendung etwas umschreibe und das JFrame eigenständig aufrufe? Muss ich dann auch noch was signieren, oder beachten, oder sollte dann alles laufen?


----------



## L-ectron-X (5. Apr 2007)

Ist es genau die gleiche Fehlermeldung (identischer Wortlaut)?

Applikationen brauchen nicht signiert zu werden. Bin mir da jetzt nicht ganz sicher, ich vermute, dass du bei Verwendung eines Applets in ClientImpl auch den RMISecurityManager instanziieren musst. Auf jeden Fall aber, wenn du es als Applikation laufen lässt.


----------



## Maddin28 (5. Apr 2007)

Ja, der Wortlaut ist der selbe. Ich hab das Programm auf einer Linux Kiste am Laufen, die Batch Datei zur Signierung eines Applets ist aber windows.bat. also hab ich alles auf ne Windows Kiste kopiert, dort die Batch-Datei aufgerufen, und naschließend wieder alles zurückkopiert auf den Server. Ich weiß nicht, ob das überhaupt geht, oder ob man das Zertifikat auf dem Rechner erstellen muss, auf welchem dann auch das Applet läuft. 

dass ich den RMISecurityManager auch in ClientImpl instanzieren muss hab ich mir schon gedacht, allerdings wollte ich zunächst mal probieren, ob das Applet an sich überhaupt angezeigt wird, was ja leider nicht der Fall ist.


----------



## L-ectron-X (5. Apr 2007)

Maddin28 hat gesagt.:
			
		

> Ich weiß nicht, ob das überhaupt geht, oder ob man das Zertifikat auf dem Rechner erstellen muss, auf welchem dann auch das Applet läuft.


In dem Fall könnte man das Applet ja nicht im Internet veröffentlichen...  :wink:

Zeig mal deine HTML-Datei.


----------



## Guest (5. Apr 2007)

```
<html>
<head>
<title>Java-Applets einbinden</title>
</head>
<body>

  <applet archive="MeinJar.jar" code="index.class" width="800" height="600" alt="Java-Applets mit HTML-Farbw&hler">

  </applet>
</p>

</body>
</html>
```


----------



## L-ectron-X (5. Apr 2007)

Jo, passt so. Und MeinJar.jar ist ganz sicher signiert? Bekommst du den Dialog zum Akzeptieren des Zertifiakts vom Browser angezeigt?


----------



## Guest (5. Apr 2007)

Nein den Dialog bekomme ich nicht, aber ich hab das Jar File mit der Batch-Datei aus dem FAQ erstellt!


----------



## L-ectron-X (5. Apr 2007)

Wenn du den Dialog nicht bekommst, ist dein Applet auch nicht signiert.
Vielleicht hast du die unsignierte Version auf den Webserver geladen?

Das Tool gibt im Fehlerfall u.U. auch Meldungen aus... Gabs da welche?

Hast du das Applet auch mal von anderen Rechnern aus aufgerufen?


----------



## Wildcard (5. Apr 2007)

L-ectron-X hat gesagt.:
			
		

> Vielleicht hast du die unsignierte Version auf den Webserver geladen?


Oder der böse Java Cache hat wieder zugeschlagen. Als Entwickler sollte man den ganz ausschalten.


----------



## Maddin28 (5. Apr 2007)

Komisch...im firefox fragt er nicht danach, ich hab's jetzt mit dem IE probiert und das Applet wird nun angezeigt (nachdem man das Zertifikat anerkennt).
Soweit sogut, allerdings klappt es immer noch nicht, wenn ich auf dem Server jetzt die ServerImpl starte, geht das soweit. Allerdings erhalte ich bei jedem JFrame, welches ich dann über das Applet erzeuge folgende Meldungen in der JavaConsole auf dem Client:

```
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: 
	java.net.ConnectException: Connection refused: connect
	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.invoke(Unknown Source)
	at ServerImpl_Stub.registerMe(Unknown Source)
	at ClientImpl.<init>(ClientImpl.java:48)
	at index.mouseClicked(index.java:53)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.List.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(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)
	... 18 more
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: 
	java.net.ConnectException: Connection refused: connect
	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.invoke(Unknown Source)
	at ServerImpl_Stub.registerMe(Unknown Source)
	at ClientImpl.<init>(ClientImpl.java:48)
	at index.mouseClicked(index.java:53)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.List.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(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)
	... 18 more
```


----------



## L-ectron-X (5. Apr 2007)

Du musst den Port öffnen, an dem du die RMI-Registry lauschen lässt. Der Standard-Port ist 1099.


----------



## Maddin28 (5. Apr 2007)

rmiregistry ist ausgeführt und lauscht am standartport 1099. Das hab ich extra nochmal überprüft, mit telnet 192.168.0.220 1099. Und da komm ich drauf. 
hmmm.... ich bin ratlos.


----------



## Maddin28 (5. Apr 2007)

Jetzt klappert's! Ich hab gegoogelt und gefunden, dass da wohl ein DNS Problem vorliegt, da das eigene Netzwerkinterface nicht mit der öffentlichen IP, sondern in erster linie als 127.0.0.1 gesehen wird. Das kann mit folgendem Schalter umgebogen werden und dann wie gesagt geht's auch:
-Djava.rmi.server.hostname=192.168.0.220

Danke an alle!

Achso ne Frage hätte ich noch zu den Jar. bzw. wie ich meine Sourcen gut schützen kann, sodass andere nicht an den Source kommen, auch nicht mit "Decompilern" usw.


----------



## Wildcard (5. Apr 2007)

Maddin28 hat gesagt.:
			
		

> Achso ne Frage hätte ich noch zu den Jar. bzw. wie ich meine Sourcen gut schützen kann, sodass andere nicht an den Source kommen, auch nicht mit "Decompilern" usw.


Vor dekompilieren kannst du nicht schützen.
Du kannst den Code nur schwer lesbar machen in dem du einen Obfuscator benutzt.


----------



## Maddin27 (13. Apr 2007)

Moin....jaja schon wieder ich 

Also ich hab das Ganze oben ja mittlerweile so hingekriegt, dass es in meinem internen Netzwerk 192.168.0.X läuft. Soweit sogut. Nun soll das Ding, aber nicht im internen Netz allein laufen, sondern auf ner WebSite im Internet. 
Serverseitig sollte alles passen, mein Programm läuft, und zwar genau so lange, bis es zum ersten mal auf meinen Client zugreifen will. Fehlermeldung ist dann folgende, die am Server ausgegeben wird:


> java.rmi.ConnectIOException: Exception creating connection to: 192.168.0.102; nested exception is:
> java.net.NoRouteToHostException: No route to host
> at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:587)
> at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185)
> ...


Die IP 192.168.0.102 ist die IP Adresse von dem Client, von welchem ich auf die InternetSeite/das Applet zugreife. Das sollte eigentlich doch automatisch funktionieren, also das mit dem Auflösen der Adresse, oder nicht????


----------



## L-ectron-X (13. Apr 2007)

Der RMI-Server muss auf dem gleichen Rechner laufen, wie der Webserver. Ist das bei dir so?


----------



## Maddin28 (13. Apr 2007)

Hi 

ja, also die Situation ist folgende... Der RMI Server ist mit dem Applet momentan sogar im selben Verzeichnis und erreichbar im Internet unter einer öffentlichen IP. 
Am Server wurde rmiregistry ausgeführt und der Server mit den -Djava..... Schaltern gestartet. Soweit geht es ja, vom Applet aus wird ein JFrame aufgemacht und der Inhalt richtig angezeigt (Werte werden nur vom Server gelesen). Dann beim Klicken auf einen Button sollen Werte an allen angemeldeten Clients aktualisiert werden (braucht nicht nur der Client Verbindung zum Server, sondern auch umgekehrt) und genau da hackt es dann und da bekomm ich dann die Fehlermeldung. Irgendwie auch logisch, weil direkt kann der Server, der sich im Internet befindet ja nicht auf 192.168.X.X zugreifen. 
Was mich stutzig macht, ist, dass diese Sache nicht NAT und RMI übernehmen.


----------



## L-ectron-X (13. Apr 2007)

Den Port 1099 hast du auch richtig geroutet?


----------



## Guest (13. Apr 2007)

Wieso routen? Der 1099 ist ja am Server im Internet direkt erreichbar (von den clients aus).


----------



## Maddin28 (14. Apr 2007)

Also nochmal muss ich lästig sein. Mal ganz allgemein gedacht. Auf einem Server im Internet ist die Server Klasse meines RMI Servers gestartet und läuft korrekt. Ich kann nämlich mit meinem Client auf das Serverobjekt zugreifen und bestimmte Werte abgreifen. 
Soweit sogut. 
Nun können sich wie gesagt ja mehrere Clients am Server anmelden und die Clients haben eine Methode NeuZeichnen throws RemoteException. Sobald diese aufgerufen wird, bekomme ich, dass auf den Client nicht zugegriffen werden kann. Aber genau das sollte doch RMI übernehmen, oder nicht? Wie funktionieren denn Netzwerkspiele? Ich meine, da braucht es ja das Selbe, also dass die Clients upgedatet werden. Hat vielleicht jemand ein kleines Netzwerkspiel, welches funktioniert, für mich, vielleicht kann ich mir da was abgucken.

Thx


----------



## L-ectron-X (14. Apr 2007)

In diesem Fall muss auch der Client Remote-Methoden bereitstellen, die der Server aufrufen kann.


----------



## maddin28 (15. Apr 2007)

Ja, das macht er ja auch. Aber dazu muss ich auf dem Client ja keine RMI registry laufen haben. Wie gesagt im LAN funktioniert das Ganze, nur im WAN also mit nem root-Server im Internet geht es nicht mehr.


----------



## Maddin28 (15. Apr 2007)

Moin. Ich hab nochmal drüber nach gedacht und das Einzige was mir einfällt, worauf der Server zugreifen muss ist doch die StubKlasse auf dem Client. Diese ist im Jar File enthalten und da kommt der Server logischerweise nicht ran. Aber genau deshalb hab ich das Ganze ja via Applet gemacht, ich raff das nicht. Es muss doch möglich sein ein Netzwerkspiel mit Applets zu realisieren, oder brauch ich da zwingend jsp???


----------

