Ich habe einen RMIThread, der mir in der run() Methode die Methoden eines RMIServers aufruft.Dabei wird ein Stack zurückgegeben und in ergebnis gespeichert.
Ich habe 2 RMI-Server, sowie 2 dazugehörige Interfaces.
//5002:mein gewählter Port für Server
Wenn im Browser der localhost mit dem serverport5002 aufgerufen wird, wird der zentrale Server aufgerufen, der
eine HTML Seite an den Browser schickt. DAs funktioniert auch alles. Der User gibt 2 Einträge in eine Form ein, diese werden zum Server gebracht, anschliessen dem RMIThread übergeben und dann zu den beiden RMIServen geschickt.
Das ist die RMIServerklassen mit der main(beide sind identisch und der Rest sind nur Methoden):
Das RMIIterface implementiert Remote
//list ist mein Stack mit den Werten aus der Form.
Das ganze soll eine 3-Tier Architektur darstellen.
Wenn ich nun den TelefonServer mittels des Browsers starte,kommt folgende Meldung:
Ich will das ganze erstmal auf einen Server laufen lassen, deshalb localhost.
Gelookupt wird nach rmi://localhost:6601/RMIServer
und rmi://localhost:6601/RMIServerZwei
Klingt doch logisch!
Oder ist der Pfad falsch?
Die RMIs liegen in einem anderen package als der Server, hat es damit was zu tun?
Ich weiss echt nicht wo der Fehler ist,kann Nachts schon net mehr schlafen...
Ich habe 2 RMI-Server, sowie 2 dazugehörige Interfaces.
//5002:mein gewählter Port für Server
Wenn im Browser der localhost mit dem serverport5002 aufgerufen wird, wird der zentrale Server aufgerufen, der
eine HTML Seite an den Browser schickt. DAs funktioniert auch alles. Der User gibt 2 Einträge in eine Form ein, diese werden zum Server gebracht, anschliessen dem RMIThread übergeben und dann zu den beiden RMIServen geschickt.
Das ist die RMIServerklassen mit der main(beide sind identisch und der Rest sind nur Methoden):
Das RMIIterface implementiert Remote
Java:
public class RMIServer extends UnicastRemoteObject implements RMIInterface {
// Konstruktor
public RMIServer() throws RemoteException {
super();
}
public static void main(String[] args) {
try {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
RMIServer rmi = new RMIServer();
/*
* die statische Methode rebind(String name, Remote obj) der Klasse
* Naming meldet den Dienst bei der Registry an String name ist die
* gueltige URL fuer das Server-Objekt. kann auch aussehen:
* Naming.bind(rmi://sun36/MyService",ds)
*/
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
Naming.rebind("rmi://localhost:6601/RMIServer", rmi);
System.out.println("Telefonserver 2");
System.out.println("Serverbind");
System.out.println("Der Server wartet auf Anfragen...");
} catch (Exception e) {
System.out.println("Fehler im RMI-Server");
e.printStackTrace();
}
}
//list ist mein Stack mit den Werten aus der Form.
Das ganze soll eine 3-Tier Architektur darstellen.
Java:
//RMIThread, startet Verbindung zum RMIServer
public void run() {
try {
Registry registry = LocateRegistry.getRegistry();
// Connect to remote server and service
if (server.equals("localhost")) {
RMIInterface remoteSearch = (RMIInterface) Naming.lookup("rmi://"+ server + ":" + port + "/" + name);
if (list.size() == 2) {
if (list.get(0).matches("{1}[0-9]*")
&& list.get(1).matches("[a-zA-Z]*")) {
ergebnis = remoteSearch.suchNummer(list.get(0) + "_"
+ list.get(1));
} else
ergebnis = remoteSearch.suchNummer(list.get(1) + "_"
+ list.get(0));
} else if (list.get(0).matches("{1}[0-9]*")) {
ergebnis = remoteSearch.suchNummer(list.get(0));
} else
ergebnis = remoteSearch.suchName(list.get(0));
} else {
RMIInterface2 remoteSearch = (RMIInterface2) Naming.lookup("//"
+ server + ":" + port + "/" + name);
if (list.size() == 2) {
if (list.get(0).matches("{1}[0-9]*")
&& list.get(1).matches("[a-zA-Z]*")) {
ergebnis = remoteSearch.suchNummer(list.get(0) + "_"
+ list.get(1));
} else
ergebnis = remoteSearch.suchNummer(list.get(1) + "_"
+ list.get(0));
} else if (list.get(0).matches("{1}[0-9]*")) {
ergebnis = remoteSearch.suchNummer(list.get(0));
} else
ergebnis = remoteSearch.suchName(list.get(0));
}
}
Wenn ich nun den TelefonServer mittels des Browsers starte,kommt folgende Meldung:
Java:
java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at telefonserver.MyClientThread.run(MyClientThread.java:38)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:310)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:176)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:163)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:381)
at java.net.Socket.connect(Socket.java:537)
at java.net.Socket.connect(Socket.java:487)
at java.net.Socket.<init>(Socket.java:384)
at java.net.Socket.<init>(Socket.java:198)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 6 more
java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at telefonserver.MyClientThread.run(MyClientThread.java:38)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:310)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:176)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:163)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:381)
at java.net.Socket.connect(Socket.java:537)
at java.net.Socket.connect(Socket.java:487)
at java.net.Socket.<init>(Socket.java:384)
at java.net.Socket.<init>(Socket.java:198)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 6 more
Exception in thread "main" java.lang.NullPointerException
at telefonserver.Telefon.ausgabeNamenStack(Telefon.java:130)
at telefonserver.Telefon.main(Telefon.java:98)
Ich will das ganze erstmal auf einen Server laufen lassen, deshalb localhost.
Gelookupt wird nach rmi://localhost:6601/RMIServer
und rmi://localhost:6601/RMIServerZwei
Klingt doch logisch!
Oder ist der Pfad falsch?
Die RMIs liegen in einem anderen package als der Server, hat es damit was zu tun?
Ich weiss echt nicht wo der Fehler ist,kann Nachts schon net mehr schlafen...
Zuletzt bearbeitet: