RMI - Client Zugriff auf Server funktioniert nicht

Status
Nicht offen für weitere Antworten.

tobitobsen82

Mitglied
Hallo,

ich arbeite gerade an einer simplen Bankkonten-Anwendung. Es gibt u. a. einen BankClient (Client) und eine Bank (Server). Nebst diesen noch einige Interfaces und Implements zur Verwaltung der Kunden und Konten (Objekte). Das ganze läuft über zwei Swing-Fenster, eins für den Kunden und eins für die Bank. Das Bank-Fenster funktioniert einwandfrei und das Auslesen der Kunden- und Kontendaten bereitet keine Probleme. Der Client kann sich zwar anmelden und der lookup() funktioniert auch, aber sobald ich auf bestehende Konten zugreifen möchte erhalte ich folgende Fehlermeldung:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: serverPackage.AccountAdmin
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at $Proxy0.getAccountAdmin(Unknown Source)
at clientPackage.ClientGui.loginProcedure(ClientGui.java:96)
at clientPackage.ClientGui.access$4(ClientGui.java:83)
at clientPackage.ClientGui$EventHandling.actionPerformed(ClientGui.java:72)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: serverPackage.AccountAdmin
at java.io_ObjectInputStream.readObject0(Unknown Source)
at java.io_ObjectInputStream.readObject(Unknown Source)
at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
... 34 more
Caused by: java.io.NotSerializableException: serverPackage.AccountAdmin
at java.io_ObjectOutputStream.writeObject0(Unknown Source)
at java.io_ObjectOutputStream.writeObject(Unknown Source)
at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Leider habe ich dazu bislang keine passende Lösung gefunden.

Nachfolgend noch meine beiden mains (BankClient.java und Bank.java):

Code:
package clientPackage;

import java.io.IOException;
import java.rmi.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import serverPackage.AccountInterface;

public class BankClient {

	public static void main(String[] args) throws NotBoundException, IOException {
		Registry registry = LocateRegistry.getRegistry(); 
		AccountInterface serverObject = (AccountInterface) registry.lookup("AccountAdmin");
		
		ClientGui clientWindow = new ClientGui(serverObject);
		
	}
}

Code:
package serverPackage;

import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Bank {

	public static void main(String[] args) throws IOException {
		Account myBank;
		AccountAdmin myAdmin;
		try {
			LocateRegistry.createRegistry( Registry.REGISTRY_PORT ); 
			
			myBank = new Account();
			Naming.rebind("AccountAdmin", myBank);
			
			myAdmin = new AccountAdmin(); 
			
			Customer customer1 = new Customer("c1", "Hans Günther");
			Account accountC1 = new Account(customer1, "a1", 332.45);
			myAdmin.addAccount(accountC1);
			
			ServerGui serverWindow = new ServerGui(myAdmin);
			
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

}

Danke für eure Hilfe!
 

tobitobsen82

Mitglied
Tja irgendwie komme ich nicht weiter.

Hab mein Programm nochma etwas umgeschrieben und besser strukturiert, komme aber über den Client einfach nicht an meinen Konten bzw. Kunden ran. Vom Server läufts über dieselbe Klasse (die Impl des Interface für den Client) wunderbar.

Code:
public class BankClient {

	public static void main(String[] args) throws NotBoundException, IOException {
		
		Registry registry = LocateRegistry.getRegistry(); 
		AccountAdmin serverObject = (AccountAdmin) registry.lookup("AccountAdmin");
		
		ClientGui clientWindow = new ClientGui(serverObject);
		System.out.println(serverObject.getAccounts().size());
	}
}

der syso liefert 0, obwohl 6 Accounts angelegt wurden und diese über den Server auch abrufbar sind:

Code:
package serverPackage;

import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Bank {

	public static void main(String[] args) throws IOException {
		AccountAdmin myAdmin;
		
		try {
			myAdmin = new AccountAdmin();
			
			LocateRegistry.createRegistry( Registry.REGISTRY_PORT );
			Naming.rebind("AccountAdmin", myAdmin); 
			
			Customer customer1 = new Customer("c1", "Hans Günther");
			Account accountC1 = new Account(customer1, "a1", 332.45);
			myAdmin.addAccount(accountC1);
			
			Customer customer2 = new Customer("c2", "Willy Sowieso");
			Account accountC2 = new Account(customer2, "a2", 11.05);
			myAdmin.addAccount(accountC2);
			
			Customer customer3 = new Customer("c3", "Hilde Becker");
			Account accountC3 = new Account(customer3, "a3", 5402.78);
			myAdmin.addAccount(accountC3);
			
			Customer customer4 = new Customer("c4", "Heinz Becker");
			Account accountC4 = new Account(customer4, "a4", 143.12);
			myAdmin.addAccount(accountC4);
			
			Customer customer5 = new Customer("c5", "Angie Merkel");
			Account accountC5 = new Account(customer5, "a5", 76.39);
			myAdmin.addAccount(accountC5);
			
			Customer customer6 = new Customer("c6", "Michael Jackson");
			Account accountC6 = new Account(customer6, "a6", 98720.98);
			myAdmin.addAccount(accountC6);
			
			ServerGui serverWindow = new ServerGui(myAdmin);
			
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

}
 

tobitobsen82

Mitglied
Nächster Schritt! Da ich die Reihenfolge nicht beachtet hatte, konnte mein "rebind()-Objekt" gar keinen Inhalt haben...das ist nun gelöst.

Allerdings habe ich nun folgendes Problem:

Das Objekt, welches auf der Serverseite erstellt wird, wird an den Client per lookup() als Remote-Objekt übertragen. Der Client hat folglich alle Daten, die das Server-Objekt mit sich gebracht hat. Wenn ich nun auf meinem Client Änderungen an dem (Remote) Objekt durchführe, werden diese zwar auf dem (Remote) Objekt geschrieben, nicht jedoch auf dem Server Objekt.

In meiner konkreten Banken-Anwendung bedeutet das, wenn ein Kunde Geld von seinem "Client-Konto" abhebt, kriegt die Bank (der Server) davon nichts mit. Ungünstig (für die Bank und für mich...)

Bin für jeden Rat dankbar!

Hier ein Ausschnitt aus meinem Client und meinem Server:

Client:
Code:
package clientPackage;

import java.io.IOException;
import java.rmi.NotBoundException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import serverPackage.AccountAdminInterface;

public class BankClient {

	public static void main(String[] args) throws NotBoundException, IOException {
		
		Registry registry = LocateRegistry.getRegistry(); 
		AccountAdminInterface serverObject = (AccountAdminInterface) registry.lookup("AccountAdmin");
		
		ClientGui clientWindow = new ClientGui(serverObject);
		System.out.println(serverObject);
	}
}

Server:
Code:
package serverPackage;

import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Bank {
	
	public static void main(String[] args) throws IOException {
		AccountAdmin myAdmin;
		
		try {
			myAdmin = new AccountAdmin();
			
			Customer customer1 = new Customer("c1", "Hans Günther");
			Account accountC1 = new Account(customer1, "a1", 332.45);
			myAdmin.addAccount(accountC1);
			
                        //.... andere Accounts und Customer werden angelegt
			
			LocateRegistry.createRegistry( Registry.REGISTRY_PORT );
			Naming.rebind("AccountAdmin", myAdmin); 
			
			ServerGui serverWindow = new ServerGui(myAdmin);
			System.out.println(myAdmin);
			
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

}
 

tobitobsen82

Mitglied
Nachdem ich einige Klassen (AccountAdmin und Account) von UnicastRemoteObject ableiten lasse funktioniert es und beide Seiten (Server/Client) arbeiten auf dem identischen Objekt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
N FTP FTP Client invalid IPv6 address (Apache Commons Net API) Netzwerkprogrammierung 6
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
X RMI: Woher kennt der Client das Schnittstellen-Interface? Netzwerkprogrammierung 2
E Thematik Client server Netzwerkprogrammierung 2
D UDP Client empfängt nichts Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
N Client Identifikation eines Servers Netzwerkprogrammierung 1
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
D SSH Client Netzwerkprogrammierung 7
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
B TCP Client Android Netzwerkprogrammierung 3
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
OnDemand Ist Client noch angemeldet? Netzwerkprogrammierung 7
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
J Client Server - Serialisierung Netzwerkprogrammierung 8
C Client connection per Portforwarding auf einen lokalen Serverport Netzwerkprogrammierung 3
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben