RMI - Java Insel?

flashray

Erfahrenes Mitglied
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?

Java:
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; 
}

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

Java:
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" ); 
  } 
}

Java:
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
 
Hallo,

Code:
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
 
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).
 
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
 
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
 
Hallo,

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

Java:
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;
}

Java:
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;
	}
}

Java:
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();
		}
	}
}

Java:
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:

Code:
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
 
Zurück