Fehler bei der Programmierung eines Universaldienstbrowsers

Tomstar

Mitglied
Hallo,

ich möchte einen Universaldienstbrowser programmieren (aus dem Buch: Java von Kopf bis Fuß). Hierbei eine kurze Beschreibung zur Funktionsweise:

Dabei wird RMI eingesetzt, wodurch der DienstBrowser als Client gestartet wird, in der RMI-Registrierung nachschlägt, um den Dienst namens DienstServer zu finden und den Stub bekommt.
Der Client ruft getDienstListe() auf und der DienstServer gibt ein Array von Diensten zurück, anschließend zeigt der Client die Liste der Dienste in einem GUI an. Der Benutzer wählt etwas aus der Liste aus, wodurch der Client die Methode getDienst() auf dem Remote-Dienst aufruft, danach gibt dieser ein serialisiertes Objekt zurück (einen Dienst), der im Client Browser laufen wird, danach ruft der Client getGuiPanel() auf dem Dienstobjekt auf, das er vom Remote-Dienst erhalten hat...

Mein Problem:: Er bringt folgenden Fehler bei der Ausführung:

Java:
java.rmi.ConnectException: Connection refused to host: 192.168.178.21; 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.newCall(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
	at java.rmi.Naming.rebind(Unknown Source)
	at DienstServerImpl.main(DienstServerImpl.java:41)
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)
	... 7 more
Remote-Dienst läuft




Hier die Codeabschnitte (ohne die eig. Dienste, da diese nicht den Fehler auslösen)

Interface DienstServer
Java:
import java.rmi.*;

public interface DienstServer extends Remote {
	
	Object[] getDienstListe() throws RemoteException;
	Dienst getDienst(Object dienstSchlüssel) throws RemoteException;
	
	

}

Interface Dienst

Java:
import javax.swing.*;
import java.io.*;

public interface Dienst extends Serializable {
	
	public JPanel getGuiPanel();

}

DienstServerImpl

Java:
import java.rmi.*;
import java.rmi.server.*;
import java.util.*;

public class DienstServerImpl extends UnicastRemoteObject implements DienstServer {
	
	HashMap<String, Dienst> dienstListe;
	
	public DienstServerImpl() throws RemoteException {
		
		diensteEinrichten();
	}
	
	private void diensteEinrichten () {
		
		dienstListe = new HashMap<String, Dienst>();
		dienstListe.put("Würfeldienst", new WürfelDienst());
		dienstListe.put("Wochtentagsdienst", new Wochentagedienst());
		dienstListe.put("Musikvideodienst", new MiniMusikDienst());
		
		
	}
	
public Object[] getDienstListe() {
	
	System.out.println("in Remote");
	return dienstListe.keySet().toArray();
}



public Dienst getDienst(Object dienstSchlüssel) throws RemoteException {
	
	Dienst derDienst = dienstListe.get(dienstSchlüssel);
	return derDienst;
	
}

public static void main(String[]args) {
	
	try {
		
		Naming.rebind("DienstServer", new DienstServerImpl());
	}catch(Exception ex){ex.printStackTrace();}
	
	System.out.println("Remote-Dienst läuft");
}
	
}

DienstBrowser

Java:
import java.awt.*;
import javax.swing.*;
import java.rmi.*;
import java.awt.event.*;

public class DienstBrowser {
	
	JPanel hauptPanel;
	JComboBox dienstListe;
	DienstServer server;
	
	public void erstelleGUI() {
		
		JFrame frame = new JFrame("RMI-Browser");
		hauptPanel = new JPanel();
		frame.getContentPane().add(BorderLayout.CENTER, hauptPanel);
		
		Object[] dienste = getDienstListe();
		
		dienstListe = new JComboBox(dienste);
		
		frame.getContentPane().add(BorderLayout.NORTH, dienstListe);
		dienstListe.addActionListener(new MeinListenListener());
		
		frame.setSize(500,500);
		frame.setVisible(true);
	}
	
	void ladeDienst(Object dienstAuswahl) {
		
		try {
			
			Dienst dienst = server.getDienst(dienstAuswahl);
			hauptPanel.removeAll();
			hauptPanel.add(dienst.getGuiPanel());
			hauptPanel.validate();
			hauptPanel.repaint();
			
		}catch(Exception ex){ex.printStackTrace();}
	}
	
	
	Object[] getDienstListe() {
		
		Object obj = null;
		Object[] dienste = null;
		
		try {
			
			obj = Naming.lookup("rmi://127.0.0.1/DienstServer");
		}catch(Exception ex) {
			ex.printStackTrace();
		}
		server = (DienstServer) obj;
		
		try {
			
			dienste = server.getDienstListe();
		}catch(Exception ex) {
			ex.printStackTrace();
		}
		return dienste;
	}
	
	class MeinListenListener implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			
			Object auswahl = dienstListe.getSelectedItem();
			ladeDienst(auswahl);
		}
	}
	
	public static void main(String[]args) {
		
		new DienstBrowser().erstelleGUI();
	}

}
 
Hallo Elke,

vielen Dank, das war es! Wie konnte ich das auch vergessen ???:L


Ich konnte es aber nur mit der Console bewerkstelligen, also mit dem rmic Werkzeug und der start rmiregistry. Hatte dann drei Consolenfenster offen: Einmal mit der rmiregistry, dann der java DienstServerImpl, damit der Remote-Dienst läuft und einmal das eig. ausführen des DienstBrowsers(Client)!

Wie kann ich das nun mit Eclipse anstellen? Habe mal gelesen, dass man hier auch Pakete benutzen soll!?

Dankeschön für die Antworten 😉.
 
Zuletzt bearbeitet:

Zurück
Oben