# RMI - Java Insel?



## flashray (5. Juni 2007)

Hallo,

wollte das RMI Beispiel aus der Java Insel ausprobieren. Nur leider wirft der Server immer eine Exception beim Starten. Warum? Ist das Beispiel etwa fehlerhaft?


```
package com.javatutor.insel.rmi; 
 
import java.rmi.Remote; 
import java.rmi.RemoteException; 
 
public interface Adder extends Remote 
{ 
  int add( int x, int y ) throws RemoteException; 
}
```


```
package com.javatutor.insel.rmi; 
 
public class AdderImpl implements Adder 
{ 
  public int add( int x, int y ) 
  { 
    return x + y; 
  } 
}
```


```
package com.javatutor.insel.rmi; 
 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.RemoteServer; 
import java.rmi.server.UnicastRemoteObject; 
 
public class Server 
{ 
  public static void main( String[] args ) throws Exception 
  { 
    AdderImpl adder = new AdderImpl(); 
    Adder stub = (Adder) UnicastRemoteObject.exportObject( adder, 0 ); 
    RemoteServer.setLog( System.out ); 
 
    Registry registry = LocateRegistry.getRegistry(); 
    registry.rebind( "Adder", stub ); 
 
    System.out.println( "Adder angemeldet" ); 
  } 
}
```


```
package com.javatutor.insel.rmi; 
 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
 
public class Client 
{ 
  public static void main( String[] args ) throws Exception 
  { 
    Registry registry = LocateRegistry.getRegistry(); 
    Adder adder = (Adder) registry.lookup( "Adder" ); 
    System.out.println( adder.add( 47, 11 ) ); 
  } 
}
```
http://www.galileocomputing.de/open...18_003.htm#mj693d4e8dad425489d0d718fc4d63656f


Vg Erdal


----------



## lumpmitpump (5. Juni 2007)

stubs haste gebaut?


----------



## Thomas Darimont (5. Juni 2007)

Hallo,

bei entsprechender Konfiguration braucht man ab Java 5 keine Stubs mehr...
Welche Exception?

Wir haben auch einige RMI Beispiele hier:
http://www.tutorials.de/forum/java/231847-rmi-unter-java-5-a.html
http://www.tutorials.de/forum/java/269599-rmi-als-eclipse-plug.html
http://www.tutorials.de/forum/java/232539-rmi.html
http://www.tutorials.de/forum/j2ee/275294-rmi-mit-spring.html
...

Gruß Tom


----------



## flashray (5. Juni 2007)

Hallo,


```
Exception in thread "main" java.rmi.ConnectException: Connection refused to host: 192.168.1.33; nested exception is: 
	java.net.ConnectException: Connection refused: connect
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
	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.rebind(Unknown Source)
	at com.javatutor.insel.rmi.Server.main(Server.java:15)
Caused by: java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
	at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
	at java.net.Socket.connect(Socket.java:519)
	at java.net.Socket.connect(Socket.java:469)
	at java.net.Socket.<init>(Socket.java:366)
	at java.net.Socket.<init>(Socket.java:179)
	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)
	... 5 more
```

Genau, hatte auch in der Java Insel gelesen das Stubs nicht mehr nötig sind. Ich hab JDK 6.1 installiert, ist auch korrekt in eclipse eingerichtet. Der eclipse Compiler ist auch auf 6.0 gestellt.


Vg Erdal


----------



## Kulabac (5. Juni 2007)

Hmm ... RMI ist verdammt lange her bei mir  War glaub ich noch Version 1.4.x mit der ich zuletzt damit gearbeitet habe.

Braucht man rmiregstriy noch? Wenn ja ist das gestartet? Könnte deine Firewall dein Connection-Refused-Problem verursachen? Ich mein mich auch dunkel dran erinnern zu können, dass ich mal das policy-file ändern musste um eine ähnliche Exception wegzukriegen ... (nur mal so als Denkanstöße).


----------



## lumpmitpump (5. Juni 2007)

mmmh bei uns traten ähnliche fehler auf, wenn die java- policy nicht gesetzt war... sollte aber mit den neuen javaversionen eigentlich auch unnötig sein...


jre1.6.0_01\lib\security\


da gehts zumindest um die socket- permissions


----------



## Ronin-Jay (5. Juni 2007)

Hast Du die RMI-Registry gestartet?


----------



## Thomas Darimont (5. Juni 2007)

Hallo,

LocateRegistry.getRegistry() erstellt AFAIK  eine RMI Registry, wenn keine da ist... (du musst auch den Server laufen lassen ... also ein TimeUnit.Seconds.sleep(...); am Ende der Main Methode hinterlegen) meine Vermutung wäre eher, dass in dem Rechner mehrere Netzwerkkarten sind und die RMI Registry an ein anderes Interface gebunden ist, als der Client sich mit verbinden will...

Siehe auch:
http://www.tutorials.de/forum/java/231847-rmi-unter-java-5-a.html
-> -J-Djava.rmi.server.hostname=192.168.76.98 ...

Gruß Tom


----------



## flashray (5. Juni 2007)

Hallo,

habe folgendes Beispiel aus den Vorlesungsfolien ausprobiert. Da gibts auch Probleme:


```
package one;

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

public interface Counter extends Remote {
	public void inc() throws RemoteException;

	public void dec() throws RemoteException;

	public int value() throws RemoteException;
}
```


```
package one;

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

public class CounterImpl extends UnicastRemoteObject implements Counter {
	private int value;

	CounterImpl() throws RemoteException {
		super();
	}

	synchronized public void inc() {
		++value;
	}

	synchronized public void dec() {
		--value;
	}

	public int value() {
		return value;
	}
}
```


```
package one;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {
	public static void main(String[] args) {
		System.setSecurityManager(new RMISecurityManager());
		try {
			LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
			Naming.rebind("Counter", new CounterImpl());
			System.out.println("Counter bound");
		} catch (Exception e) {
			System.err.println("Counter exception:");
			e.printStackTrace();
		}
	}
}
```


```
package one;

import static java.lang.System.in;
import static java.lang.System.out;

import java.io.IOException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;

public class Client {
	public static void main(String args[]) {
		System.setSecurityManager(new RMISecurityManager());
		try {
			Counter c = (Counter) Naming.lookup("Counter");
			int inp = -1;
			do {
				out.print("Counter value: " + c.value() + "\nAction (+/-/e)? ");
				out.flush();

				do {
					try {
						inp = in.read();
					} catch (IOException ioe) {
					}
				} while (inp != '+' && inp != '-' && inp != 'e');
				if (inp == '+')
					c.inc();
				else if (inp == '-')
					c.dec();
			} while (inp != 'e');
		} catch (Exception e) {
			System.err.println("Counter exception:");
			e.printStackTrace();
		}
	}
}
```

Wenn ich den Server Starte kommt folgender Fehler:


```
Counter exception:
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:179)
	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.rebind(Unknown Source)
	at java.rmi.Naming.rebind(Naming.java:160)
	at one.Server.main(Server.java:13)
```

Die Microsoft XP eigene Firewall habe ich inzwischen ausgeschaltet. Habe keine anderen Firewalls installiert.

Hab in der java.policy Datei nachgeschaut, da steht folgende Zeile bezüglich Sockets:
	// allows anyone to listen on un-privileged ports
	permission java.net.SocketPermission "localhost:1024-", "listen";


Vg Erdal


----------



## lumpmitpump (5. Juni 2007)

joaaa dann würd ich vorschlagen:

permission java.net.SocketPermission "localhost:1024-", "accept,connect,listen";


----------



## Ronin-Jay (5. Juni 2007)

Versuch mal den Tipp von Thomas mit der Netzwerkkarte. Ich hatte das Problem auch mal. Zwar konnte ich mich an der registry anmelden, aber komischerweise gingen die Antworten auf einem anderen Interface raus. Server und Client lagen auf verschiedenen Rechnern, wovon der Server 2 Netzwerkkarten hatte.


----------



## flashray (5. Juni 2007)

Ronin-Jay hat gesagt.:


> Hast Du die RMI-Registry gestartet?



Nein hab ich nicht  . Da hab ich wohl glatt was essentielles überlesen  .

Vg Erdal


----------



## Thomas Darimont (5. Juni 2007)

Hallo,

wenn du den RMISecurityManager weglässt geht das auch ohne das du ihm entsprechende permissions zuweist, wie in meinen Beispielen gezeigt.

Die Verwendung eines SecurityManagers verkomplizieren die Beispiele nur...

Gruß Tom


----------

