Gui mit Rmi und Observer (extends Probleme)

mesmo

Grünschnabel
Hallo liebe Community,
ich möchte folgendes Beispiel mit Gui Aktualisieren ausführen, aber die Gui Update Methode funktioniert irgendwie nicht und ich kann nicht mehr als ein Client aufmachen. Hat jemand eine Idee, wie ich das Ding zum laufen bekomme?
Vielen Dank im Voraus.
Java:
package observerRMIBsp4;
import java.io.Serializable;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
import java.util.Observable;
import java.util.Observer;

public class RmiServer extends Observable implements RmiService {

    @Override
    public void addObserver(RemoteObserver o) throws RemoteException {
        WrappedObserver mo = new WrappedObserver(o);
        addObserver(mo);
        System.out.println("Added observer:" + mo);
    }

    Thread thread = new Thread() {
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(5 * 1000);
                } catch (InterruptedException e) {
                }
                setChanged();
                notifyObservers(new Date());
            }
        };
    };

    public RmiServer() {
        thread.start();
    }

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
       
        try {
            Registry rmiRegistry = LocateRegistry.createRegistry(9999);
            RmiService rmiService = (RmiService) UnicastRemoteObject
                    .exportObject(new RmiServer(), 9999);
            rmiRegistry.bind("RmiService", rmiService);
            System.out.println("server gestartet");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}
Java:
package observerRMIBsp4;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JLabel;

public class ClientGui extends JFrame implements  RemoteObserver, Serializable {

	private JPanel contentPane;
	JLabel lblNewLabel;
	static RmiClient r;
	static ClientGui client;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		client = new ClientGui();
    	try {
			RmiService remoteService = (RmiService) Naming.lookup("//localhost:9999/RmiService");
			UnicastRemoteObject.exportObject(client, 1099);
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		} catch (RemoteException e1) {
			e1.printStackTrace();
		} catch (NotBoundException e1) {
			e1.printStackTrace();
		} 
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					client = new ClientGui();
					client.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public ClientGui() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		lblNewLabel = new JLabel();
		lblNewLabel.setBounds(125, 49, 252, 84);
		contentPane.add(lblNewLabel);
		set("Hallo1");
		
		
	}
	
	public void set(String h){
		lblNewLabel.setText(h);
		System.out.println("h");
	}
	
	@Override
    public void update(Object observable, Object updateMsg)
            throws RemoteException {
        set("got message: "+updateMsg);
        System.out.println("got message:" + updateMsg);
    }
}
Java:
package observerRMIBsp4;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.Observable;
import java.util.Observer;

class WrappedObserver implements Observer, Serializable {

    private static final long serialVersionUID = 1L;

    private RemoteObserver ro = null;

    public WrappedObserver(RemoteObserver ro) {
        this.ro = ro;
    }

    @Override
    public void update(Observable o, Object arg) {
        try {
            ro.update(o.toString(), arg);
        } catch (RemoteException e) {
            System.out
                    .println("Remote Exception Observer wurde gelöscht:" + this);
            o.deleteObserver(this);
        }
    }

}
Java:
package observerRMIBsp4;

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

public interface RmiService extends Remote {

    void addObserver(RemoteObserver o) throws RemoteException;

}
Java:
package observerRMIBsp4;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RemoteObserver extends Remote {

    void update(Object observable, Object updateMsg) throws RemoteException;

}
 
Hallo,

könntest du etwas genauer werden als "Das funktioniert irgendwie nicht!"?. Kompiliert es nicht, bekommst du einen Lauf-Zeit-Fehler?

Gruß,
Wolf
 
Ich mache es ganz ausführlich.
Wenn ich es ausführe, dann kommt kein Fehler raus. Die update() Methode wird quasi komplett ignoriert. Aber der Server läuft ohne Probleme.
Das ganze habe ich mit einem Client ohne Gui ausprobiert, dann klappt es, weil ich UnicastRemoteObject erben kann, aber hier kann ich es wegen JFrame nicht erben. Deshalb nehme ich die export-Methode direkt, was mir nur einen Clienten erlaubt, weil ich das Port angeben muss und beim zweiten Client einen "ExportException: Port already in use: 1099 auswirft" Und wie gesagt, wird die UpdateMethode komplett ignoriert.
 
Für den Ports habe ich folgendes herausbekommen:
Wenn man als Port 0 angibt, dann werden jedes mal andere Ports ausgewählt, sodass man keine belegte Portprobleme mehr bekommt.
 
Zurück