Remote observing
heyJeg har et remote objekt som jeg gerne vil gøre observable, men kan ikke helt hitte ud af at bringe de to ting sammen.
Jeg har sat RMI'et op og ligeledes har fået sat klienter op, der kan tilgå objektet, men det jeg ønsker er når den ene klient har opdateret objektet, at de andre så får besked om dette og viser det
Spg er af den grund, hvordan kan man sætte det op?
Tak
Mine klasser ser således ud
### obj.java ###
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
public class obj extends UnicastRemoteObject implements objI {
private String s;
public obj() throws RemoteException {
}
public String getS() {
System.out.println("s = " + s + " er blevet sendt til klient");
return s;
}
public void setS(String s) {
System.out.println("s er sat til: " + s);
this.s = s;
}
public static void main(String[] args) {
String navn = "obj";
try {
LocateRegistry.createRegistry(1099);
objI o = new obj();
Naming.rebind(navn, o);
System.out.println(navn + " registreret");
}
catch (Exception e) {
System.out.println(e);
}
}
}
### objI.java ###
import java.rmi.*;
public interface objI extends Remote {
public String getS() throws RemoteException;
public void setS(String s) throws RemoteException;
}
### Klient.java ###
import java.rmi.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Klient extends JFrame {
objI o = null;
JLabel jLabel1 = new JLabel();
JButton jButton1 = new JButton();
JTextField jTextField1 = new JTextField();
JButton jButton2 = new JButton();
public Klient() {
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
try {
o = (objI) Naming.lookup("//localhost:1099/obj");
}
catch (Exception ex) {
System.out.println(ex);
}
jLabel1.setText(o.getS());
jLabel1.setBounds(new Rectangle(20, 26, 151, 28));
this.getContentPane().setLayout(null);
this.setSize(400, 150);
jButton1.setBounds(new Rectangle(266, 21, 96, 25));
jButton1.setText("Aflæs");
jButton1.addActionListener(new Klient_jButton1_actionAdapter(this));
jTextField1.setBounds(new Rectangle(15, 58, 204, 21));
jButton2.setBounds(new Rectangle(265, 54, 99, 25));
jButton2.setText("Opdater");
jButton2.addActionListener(new Klient_jButton2_actionAdapter(this));
this.getContentPane().add(jLabel1, null);
this.getContentPane().add(jTextField1, null);
this.getContentPane().add(jButton1, null);
this.getContentPane().add(jButton2, null);
}
void jButton1_actionPerformed(ActionEvent e) {
try {
jLabel1.setText(o.getS());
}
catch (RemoteException ex) {
}
}
void jButton2_actionPerformed(ActionEvent e) {
try {
o.setS(jTextField1.getText());
}
catch (RemoteException ex) {
}
}
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
Klient k = new Klient();
k.setLocation(405 * i, 0);
k.show();
}
}
}
class Klient_jButton1_actionAdapter
implements java.awt.event.ActionListener {
Klient adaptee;
Klient_jButton1_actionAdapter(Klient adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton1_actionPerformed(e);
}
}
class Klient_jButton2_actionAdapter
implements java.awt.event.ActionListener {
Klient adaptee;
Klient_jButton2_actionAdapter(Klient adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton2_actionPerformed(e);
}
}
