RMI Verschiedene Unterobjekte trotz selbem Remote Object

W

WillymF

Gast
Hallo,

ich habe frage ein Remote Object ab, das seinerseits einige Objekte (z.B. eine Liste mit den Kategorien eines Auktionshauses) gespeichert hat. Wenn ich dieses Objekt nun mit 2 "verschiedenen" Iterationen abfrage, dann kommt anscheinend das selbe Objekt zurück:

Java:
AuctionHousClient client = new AuctionHousClient();
AuctionHousClient client_test = new AuctionHousClient();
System.out.println("Vergleiche CategoryStack:");
System.out.println(client.categories.toString());
System.out.println(client_test.categories.toString());

gibt das hier aus:

Proxy[CategoryStack,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[192.168.1.3:4958](remote),objID:[48cdd2c2:1291ce59ccb:-7fff, 6115791102948140633]]]]]
Proxy[CategoryStack,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[192.168.1.3:4958](remote),objID:[48cdd2c2:1291ce59ccb:-7fff, 6115791102948140633]]]]]

Spreche ich nun aber ein "Unterobjekt" an, dann kommen andere Objekte zurück:
Java:
System.out.println("Vergleiche Category Werkzeuge:");
System.out.println(client.categories.getCategory("Werkzeuge").toString());
System.out.println(client.categories.getCategory("Werkzeuge").toString());
System.out.println(client_test.categories.getCategory("Werkzeuge").toString());
gibt das hier aus:

Vergleiche Category Werkzeuge:
Category@1690726
Category@1f1fba0
Category@1befab0

Wie kann denn das sein? Objekte, die zu einem Remote Object gehören werden ja wohl mitserialisiert und können auch verändert werden, oder?

Danke
Willy
 
W

WillymF

Gast
Der besseren Fehlerlokalisierungsmöglichkeit wegen schicke ich einmal den ganzen Code....

Ich starte zuerst AuctionServer und dann GuiTest

AuctionServer.java
[Java]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;


public class AuctionServer {

public static void main(String[] args)
{
CategoryStack categoryStack = new CategoryStackImpl();

// Export AuctionsHousClient and bind to Registry
Registry reg = null;
try
{
reg = LocateRegistry.createRegistry(4321);
UnicastRemoteObject.exportObject(categoryStack, 0);
reg.bind("auctionhouse", categoryStack);
}catch(RemoteException e)
{
e.printStackTrace();
}
catch(AlreadyBoundException e)
{
e.printStackTrace();
}

// Add Articles to Category "Eins"
ArrayList<Article> articles = new ArrayList<Article>();


// HIER INITIALISIERE ICH EIN PAAR ARTICLES

System.out.println("Tryin to add Articles...");
Category addCategory = null;
try
{
addCategory = categoryStack.getCategory("Werkzeuge");
}
catch(RemoteException ex)
{
ex.printStackTrace();
}
for(Article a: articles)
{
addCategory.addArticle(a);
System.out.println("Articles added!");
}

System.out.println("Server up. Hit enter to exit.");
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));

try
{
if (stdIn.readLine() != null)
{
stdIn.close();

if(categoryStack != null)
{
UnicastRemoteObject.unexportObject(categoryStack, false);
categoryStack = null;
}
reg.unbind("auctionhouse");
}
}
catch(IOException ex)
{
System.err.println("Error Reading STDIN.");
}
catch(NotBoundException ex)
{
System.err.println("auctionhouse not bound.");
}

}
}
[/Java]
GuiTest.java
[Java]
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;


public class GuiTest
{
public static void main(String[] args)
{
AuctionHousClient client = new AuctionHousClient();
AuctionHousClient client_test = new AuctionHousClient();

client.user = new User("testuser");
client_test.user = new User("testuser2");

System.out.println("Vergleiche CategoryStack:");
System.out.println(client.categories.toString());
System.out.println(client_test.categories.toString());

try
{
System.out.println("Vergleiche Category Werkzeuge:");
System.out.println(client.categories.getCategory("Werkzeuge").toString());
System.out.println(client.categories.getCategory("Werkzeuge").toString());
System.out.println(client_test.categories.getCategory("Werkzeuge").toString());
Category test = client.categories.getCategory("Werkzeuge");
test.addArticle(new Article());

}
catch(Exception e)
{
e.printStackTrace();
}


// HIER INITIALISIERE ICH EIN PAAR ARTICLES

System.out.println("Tryin to add Articles...");
Category addCategory = null;
try
{
addCategory = client.categories.getCategory("Werkzeuge");
}
catch(RemoteException ex)
{
ex.printStackTrace();
}
for(Article a: articles)
{
addCategory.addArticle(a);
System.out.println("Articles added!");
}

System.out.println("Gebe alle Artikel aus...");
try
{
Category test = client_test.categories.getCategory("Werkzeuge");
test = addCategory;
for(Article a: test.getArticles())
{
System.out.println(a.getArticleName());
}
}catch(Exception e)
{
e.printStackTrace();
}

System.out.println("Alle Artikel ausgegeben.");

}
}
[/Java]
AuctionHousClient.java
[Java]
import java.awt.Button;
import java.awt.Font;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;

public class AuctionHousClient extends AuctionHousGUI
{
protected CategoryStack categories;
protected Category searched_category;
protected Article selected_article;
protected Category selected_category;
protected User user;

public AuctionHousClient()
{
try
{
// TODO: localhost, port hardcoded
Registry reg = LocateRegistry.getRegistry("localhost", 4321);
Object temp = reg.lookup("auctionhouse");
categories = (CategoryStack) temp;
}
catch(RemoteException e)
{
e.printStackTrace();
}
catch(NotBoundException e)
{
e.printStackTrace();
}
// Loginmaske anzeigen
generateLoginLayout();
setVisible(true); // GUI
}

public void windowClosing(WindowEvent e) // GUI
{
System.exit(0);
}
}
[/Java]

Wie gesagt, ist das Problem, dass der AuctionServer ein Objekt erstellt und exportiert. In diesem befinden sich auch die Testartikel, die ich initialisiert und eingefügt habe. Hole ich mir das Objekt "AuctionHousClient.categories" wird mir auch das selbe Objekt angezeigt. Hole ich mir aber von diesem Objekt wieder ein "Unterobjekt" durch "AuctionHousClient.categories.getCategorie("Werkzeug")", dann kommen immer unterschiedliche Objekte zurück. Diese beinhalten die Artikel, die ich am AuctionServer eingefügt habe. Aber die Artikel, die ich mit dem Client einfüge, sind verschwunden (meine Vermutung: Da ja jedes Mal ein neues Objekt geholt wird)....

Irgendwelche Ideen? Wäre sehr dankbar....

Danke
Willy
 
W

WillymF

Gast
Solved the problem on my own.


It seems like you get and send local pointers, when you give an object to a Remot Object. Those are not found on the Remote Machine and therefor the object is null. All methods, which should be used from the remote machine, should be defined in the Remote Object with "simple" datatypes. Doesn't know, why i.e. String works though.....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F GSON wenn das Json verschiedene Klassen enthält Netzwerkprogrammierung 1
S User im Chatprogramm verschiedene Farben Netzwerkprogrammierung 1
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
B Viele verschiedene E-Mails an unterschiedliche Empfänger schnell versenden? Netzwerkprogrammierung 8
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
B verschiedene Serialisierte Objekte identifizieren? Netzwerkprogrammierung 5
F Verschiedene Datentypen senden Netzwerkprogrammierung 4
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
Luma Verschiedene Frage zu nem Netzwerkprog Netzwerkprogrammierung 6
B Verbindung über verschiedene IPs Netzwerkprogrammierung 3
D Zustand prüfen trotz Loadbalancer Netzwerkprogrammierung 3
S Peer2Peer Verbindung trotz NAT Netzwerkprogrammierung 2
A trotz dyn-IP server finden Netzwerkprogrammierung 33
Kr0e Datenaustausch trotz NIO nur halb so schnell Netzwerkprogrammierung 6
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
A Googleanfrage trotz firewall und proxi Netzwerkprogrammierung 3
R "Class not found" trotz gesetztem CLASSPATH Netzwerkprogrammierung 4
R Port trotz aktiver Firewall nutzen ! Netzwerkprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben