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:
Hier die Codeabschnitte (ohne die eig. Dienste, da diese nicht den Fehler auslösen)
Interface DienstServer
Interface Dienst
DienstServerImpl
DienstBrowser
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();
}
}