RMI - Ein Objekt für Alle?

Status
Nicht offen für weitere Antworten.
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:

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);
			}
		}	
	}
}
 
G

Guest

Gast
Das ist ein sehr nettes Beispiel.

Code:
private void callListeners(String msg) throws RemoteException
   {
      for(int i=0; i<alListeners.size(); i++)
      {
         ((MsgBoardListener)(alListeners.get(i))).msgAdded(msg);
      }
   }

Wenn ich den Code richtig verstehe, möchtes du hier die Methode des Clients aufrufen, mit dem ein update gemacht werden soll. Das wird wohl so nicht gehen. Diese Nachricht (msgAdded(msg)) muss über das Netz zum Client gehen. Dein Aufruf geht davon aus, dass es sich um ein lokales Objekt handelt, was nicht der Fall ist. Es würde micht interessieren, ob du da Fehlermeldungen bekommst (Exceptions) und wenn ja, welche?

Ich würde sagen, dass du in der Methode 'addListener' die Registrierung von Clients ganz anders machen musst. Nähmlich so, dass in dieser Methode ein Stub für den Client dem Server zugestellt wird. Das heisst, dass du auch ein Interface definieren musst, in dem die Methoden des Clients, die du auf der Serverseite aufrufen möchtest, deklariert sind. Daraus wird (...) ein Stub erzeugt und bei der Registrierung dem Server zugestellt. Erst dann könntest du die Methode 'msgAdded' aufrufen. Dieser Methodenaufruf wird dann vom Stub verpackt und dem Client zugestellt. Ich glaube, wo was wird (in dieser oder ähnlicher Form) 'callback' genannt.
 
M

Markus09

Gast
Also das mit dem Listener geht. Das hab ich wie es da steht ausgeführt (nur ohne "extends UnicastRemoteObject")

Das Problem ist, dass es nicht möglich ist, dass 2 Clients benachrichtigt werden, auch wenn sich beide registriert haben.

Es entsteht also sowas:
Client --> (A)Server(B) <-- Client

Was ich aber haben will ist etwa das:

Client --> (A)Server(A) <-- Client

Also, dass sich beide Clients auf EINEM RemoteObject anmelden.
 
G

Guest

Gast
Laut Literatur, muss die entfernte Klasse von UnicastRemoteObject abgeleitet werden.

Das ist die empfohlene Voergehensweise, die in [Sun/RMISpec 2004] beschrieben ist. Durch die Vererbung wird unsere Klasse DateImpl zu einem entfernten Objekt und kann auf entfernte Mewthodenaufrufe reagieren.

Quelle: Middleware in Java, Heinzl S., Mathes M.

Da es sich um "soll" handelt, gehe ich davon aus, dass dies nicht die einzige Möglichkeit ist, ein entferntes Obejkt so weit zu bringen, dass es auf entfernte Aufrufe reagiert.

Könntest du den Code, in dem dies mit einem Client funktioniert, zeigen?
 
G

Guest

Gast
Habe jetzt deinen Code übernommen. In der Zeile 62 der Klasse 'MessageBoardClient', Methode 'msgAddes' kommt eine NullPointerException!

Code:
data.add(msg);

Have a look!
 
M

Markus09

Gast
Wenn die Zeile:

public class MsgBoardObject extends UnicastRemoteObject implements MsgBoardInterface, Serializable


in folgende geändert wird funktioniert es:
public class MsgBoardObject implements MsgBoardInterface, Serializable

(also extends weglassen)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
J Objekt mit RSA und AES verschlüsseln und entschlüsseln HILFE Netzwerkprogrammierung 4
OnDemand Json Objekt leeres Array beim lesen Netzwerkprogrammierung 9
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
L Java RMI Objekt konsistenz Netzwerkprogrammierung 1
R RMI und Entferntes Objekt (EO) Netzwerkprogrammierung 0
A Server Antwort enthält JSON Objekt/Array Netzwerkprogrammierung 8
B udp erkennen um welches objekt es sich handelt / max size Netzwerkprogrammierung 5
S Socket Client liest leeres Objekt Netzwerkprogrammierung 10
D Remote-Objekt-Server : Alternative Methodenaufruflogik zu Reflection und hart codiert Netzwerkprogrammierung 5
K RMI Angemeldetes Objekt nicht aktuell? Netzwerkprogrammierung 9
D [CORBA] Eigenes Objekt in idl? undefined type Netzwerkprogrammierung 5
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
H Objekt von JSP an Servlet übergeben Netzwerkprogrammierung 4
T Wieso ist mein Objekt leer? Netzwerkprogrammierung 6
L RMI-Objekt zwischen zwei RMI-Servern kopieren Netzwerkprogrammierung 2
S Objekt Felder versenden Netzwerkprogrammierung 5
W Objekt über Socket übertragen Netzwerkprogrammierung 14
G Problem bei Objekt senden von server zu client Netzwerkprogrammierung 6
P RMI - Objekt als Rückgabeparameter Netzwerkprogrammierung 3
H Versenden von Objekt Netzwerkprogrammierung 2
J Prblem, wenn im verschickten Objekt ein Array ist Netzwerkprogrammierung 4
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
FrankenDerStein Socket UDP Multithreading für ein Port Netzwerkprogrammierung 2
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
F Server für Java Applikationen Netzwerkprogrammierung 16
B Webview für Anwendung Netzwerkprogrammierung 7
M Sicheres Login-System für App implementieren Netzwerkprogrammierung 6
J Netty umsetzung für ein Protokoll Netzwerkprogrammierung 1
J ERM für kleine Verwaltungsdatenbank Netzwerkprogrammierung 2
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
Messoras Launcher für mein Spiel Netzwerkprogrammierung 7
F Einfaches Gateway für Log-Files Netzwerkprogrammierung 1
P PPTP Protokoll für JAVA Netzwerkprogrammierung 14
T FTP Wie Notwendigkeit für "rekey" klientenseitig detektieren? Netzwerkprogrammierung 3
S Webserver für Jar File Netzwerkprogrammierung 4
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
M Erreichbar für alle zu sein Netzwerkprogrammierung 9
M Server nur für eine Aufgabe Netzwerkprogrammierung 2
T uberspace.de als (v)root-Ersatz für kleinere Java-Anwendungen? Netzwerkprogrammierung 12
L Proxy für Dateidownload? Netzwerkprogrammierung 3
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Socket Leitstelle für Funkspiel Netzwerkprogrammierung 8
F Java-Beispielcode für Zeroconf (ähnlich Apple Bonjour) Netzwerkprogrammierung 7
I HTTP S - Zertifikate+Cockies für Form-basierten Login Netzwerkprogrammierung 2
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
N RMI Einstellungen für "übers Internet" Netzwerkprogrammierung 8
F SSL-Zertifikate für viele Nutzer? Netzwerkprogrammierung 8
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
S wie stell man die classpath für JARs? Netzwerkprogrammierung 3
M Bestimmte Klassen für Netzwerkchecks gesucht Netzwerkprogrammierung 11
M ClassLoader für Axis2 setzen Netzwerkprogrammierung 15
M Welches Speicherformat für News-Database?? Netzwerkprogrammierung 2
Shoox VPN-Verbindung für Datenbankzugriff Netzwerkprogrammierung 2
P Proxy für Anwendung setzten Netzwerkprogrammierung 3
T Bezeichner "end of line" für die Funktion readline Netzwerkprogrammierung 5
A DataGramsocket Übertragungsproblem im Internet (IPs für Voip) Netzwerkprogrammierung 5
E Userliste für Chat Applet Netzwerkprogrammierung 4
S HTTP Kleines Programm für den Routerneustart Netzwerkprogrammierung 3
L Zeitspanne für erneutes senden Netzwerkprogrammierung 16
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
F Netzwerkprogrammierung für Anfänger Netzwerkprogrammierung 2
J Framework/ Muster für Chat-ähnliches Programm gesucht Netzwerkprogrammierung 2
B Variablen ausrichten für Übertragung Netzwerkprogrammierung 2
D FTP Pfadangabe für ftp-upload funktioniert nicht Netzwerkprogrammierung 5
K Getrennte Rechner für RMI-Server/RMI-Registry, bzw. Alternativen? Netzwerkprogrammierung 5
dayaftereh HTTPCleint und HTMLparser für hTTpBot Netzwerkprogrammierung 2
E Socket Client-Applikation mit GUI für Internet IO-Platine Netzwerkprogrammierung 2
0din Grundlage für Bluetooth Netzwerkprogrammierung 5
N "Jungfernflug" der Socketprogrammierung für ein Mühlespiel Netzwerkprogrammierung 8
F Empfehlung für embedded Webserver Netzwerkprogrammierung 10
W Bibliothek für Certificate Management Protocol (CMP) Netzwerkprogrammierung 3
O Client/Server für Ticker Netzwerkprogrammierung 2
J Stubs für SOAP-Webservice generieren. Ich bekomme es einfach nicht hin... Netzwerkprogrammierung 3
dayaftereh Bester Stream für ein Spiel? Netzwerkprogrammierung 15
data89 Sockets: ein alter Hut - für Euch - für mich nicht! Netzwerkprogrammierung 10
G FileDialog für FTP Client Netzwerkprogrammierung 2
P Welches Protokoll für RMI verwenden? Netzwerkprogrammierung 10
H RCON Tool für Gameserver Netzwerkprogrammierung 11
A Wichtig für einen Chat? Netzwerkprogrammierung 4
D Was für Verbindungen mit Socket möglich? Netzwerkprogrammierung 2
S Realisierung eines Netzwerkcodes für ein Strategiespiel Netzwerkprogrammierung 7
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
W Was für ein Stream soll ich verwenden? Netzwerkprogrammierung 8
A Rezept für Webservices Netzwerkprogrammierung 5
I unc pfad für die klasse file? Netzwerkprogrammierung 4
P eine BufferedReader für alles ankommende Netzwerkprogrammierung 2
T Filter für Input UND OutputStream Netzwerkprogrammierung 4
T Welches Netzwerk ist am bestern für. Netzwerkprogrammierung 2
G server für mein spiel. Netzwerkprogrammierung 5
M Log In Programm für Seiten Netzwerkprogrammierung 2
G Netzwerkprogrammierung für spiele Netzwerkprogrammierung 2
A IRC-Server für das lokale Netzwerk? Netzwerkprogrammierung 12
C Einfacher Filedownload mit Sockets geht nicht für pdffiles Netzwerkprogrammierung 16

Ähnliche Java Themen


Oben