M
Markus09
Gast
Hallo!
Ich gerade dabei eine RMI Anwendung zu schreiben. Dabei habe ich mir gedacht, dass es doch möglich sein muss ein faches "MessageBoard" zu entwickeln. D.h. der RMI Server speichert alle Daten und die Clients stellen sie dar und können selbst Daten hinzufügen.
Das ganze habe ich für einen Client schon geschafft. Blos wie stelle ich es an, dass beide Clients die gleichen Daten haben?
Ich hab etwas mit UnicastRemoteObject probiert, aber es wollte nicht funktionieren.
Weiß hier jemand eine Lösung?
Markus
Der Sourcecode:
Ich gerade dabei eine RMI Anwendung zu schreiben. Dabei habe ich mir gedacht, dass es doch möglich sein muss ein faches "MessageBoard" zu entwickeln. D.h. der RMI Server speichert alle Daten und die Clients stellen sie dar und können selbst Daten hinzufügen.
Das ganze habe ich für einen Client schon geschafft. Blos wie stelle ich es an, dass beide Clients die gleichen Daten haben?
Ich hab etwas mit UnicastRemoteObject probiert, aber es wollte nicht funktionieren.
Weiß hier jemand eine Lösung?
Markus
Der Sourcecode:
Code:
import java.util.ArrayList;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MsgBoardInterface extends Remote
{
public ArrayList getMessages() throws RemoteException;
public void addMessage(String msg) throws RemoteException;
public void addListener(MsgBoardListener mbl) throws RemoteException;
public void removeListener(MsgBoardListener mbl) throws RemoteException;
}
Code:
public interface MsgBoardListener
{
public void msgAdded(String msg);
}
Code:
import java.util.ArrayList;
import java.io.Serializable;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class MsgBoardObject extends UnicastRemoteObject implements MsgBoardInterface, Serializable
{
private ArrayList<String> al;
private ArrayList<MsgBoardListener> alListeners;
MsgBoardObject() throws RemoteException
{
try
{
al = new ArrayList<String>();
alListeners = new ArrayList<MsgBoardListener>();
}
catch(Exception e)
{
}
}
public void addMessage(String msg) throws RemoteException
{
al.add(msg);
callListeners(msg);
}
public ArrayList getMessages() throws RemoteException
{
return al;
}
public void addListener(MsgBoardListener mbl) throws RemoteException
{
alListeners.add(mbl);
}
public void removeListener(MsgBoardListener mbl) throws RemoteException
{
alListeners.remove(mbl);
}
private void callListeners(String msg) throws RemoteException
{
for(int i=0; i<alListeners.size(); i++)
{
((MsgBoardListener)(alListeners.get(i))).msgAdded(msg);
}
}
}
Code:
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.RemoteException;
import java.rmi.Naming;
public class MessageBoardServer
{
public static void main(String[] args)
{
// lokalen Server starten
try
{
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
MsgBoardObject mbo = new MsgBoardObject();
Naming.rebind("rmi://localhost/MsgBoardObject", mbo);
System.out.println("MsgBoardObject bound");
while(true) Thread.sleep(300);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
Code:
import java.rmi.Naming;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.Serializable;
public class MessageBoardClient implements MsgBoardListener, ActionListener, Serializable
{
private static boolean done;
private static MsgBoardInterface mbo;
private static JFrame frame;
private static JList entries;
private static JTextField text;
private static Vector<String> data;
public static void main(String[] args)
{
done = false;
MessageBoardClient listener = new MessageBoardClient();
data = new Vector<String>();
try
{
mbo = (MsgBoardInterface) Naming.lookup("rmi://localhost/MsgBoardObject");
mbo.addListener(listener);
}
catch(Exception e)
{
System.out.println(e);
}
frame = new JFrame("MessageBoardClient");
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(3,1));
JButton buttonAdd = new JButton("Hinzufügen");
buttonAdd.addActionListener(listener);
entries = new JList();
JScrollPane jsp = new JScrollPane(entries);
text = new JTextField();
frame.add(jsp);
frame.add(text);
frame.add(buttonAdd);
frame.pack();
frame.setVisible(true);
}
public void msgAdded(String msg)
{
data.add(msg);
entries.setListData(data);
}
public void actionPerformed(ActionEvent e)
{
String str = e.getActionCommand();
if(str.equals("Hinzufügen"))
{
String msg = text.getText();
try
{
mbo.addMessage(msg);
}
catch(Exception ex)
{
System.out.println("ErrEx:" + ex);
}
}
}
}