Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben

0plan

Bekanntes Mitglied
Hallo,
ich bin gerade dabei, eine Definition eines Interfaces für eine RMI Applikation zu definieren. Mir kommt gerade die Frage, wie ich es am besten löse, wenn der Server eine Aufgabe aufgrund möglicher Umstände nicht umsetzen kann. Der Client muss hierüber ja benachrichtigt werden, wenn z.B. das erstellen eines Tickets (Support System) auf der Datenbank nicht durchgeführt werden konnte.

Soll ich dann für solche Methoden der Server Klasse boolean nehmen, welche dem Client true liefert wenn die Anfrage an den Server erfolgreich war und die Aufgabe abgeschlossen wurde? Oder soll ich ein Nachrichtensystem implementieren, welches den Client nach jedem Methodenaufruf des Servers über den Status der Aktion informiert?


Beispiel:

Client:
Java:
public void createTicket(){
      if(server.createTicket()) 
                System.out.println("Ticket wurde erstellt");
      else
            //Gebe Fehlermeldung aus

}

Server:
Java:
public boolean createTicket(){

 try{
      //Erstelle ein Ticket
      return true;
 }catch (Exception ieineException)(
     Serverlog.createEvent(new Event(e.getMessage());
}
   return false; //Indikat für Fehler bei der Erstellung

}

Wie macht man sowas am besten?
 

freez

Top Contributor
Soll ich dann für solche Methoden der Server Klasse boolean nehmen, welche dem Client true liefert wenn die Anfrage an den Server erfolgreich war und die Aufgabe abgeschlossen wurde? Oder soll ich ein Nachrichtensystem implementieren, welches den Client nach jedem Methodenaufruf des Servers über den Status der Aktion informiert?

Das kommt ganz darauf an, ob der Client wissen muss, was schief gelaufen ist und ob mehrere Dinge schief gehen können. Ein boolean zeigt dir ja lediglich JA/NEIN an. Da kannst du keine weiteren Informationen transferieren. Wenn du dem Client aber genau mitteilen willst, was schief gelaufen ist, weil z.B. ein User eine Eingabe verkehrt gemacht hat, dann musst du darüber nachdenken, wie du diese Informationen zum Client transportierst.

Lange Rede, kurzer Sinn: es kommt ganz auf deine Anforderungen an.
 

0plan

Bekanntes Mitglied
Danke für deine Antwort. Der Client muss wissen was schief gelaufen ist, zwar nicht gerade irgendwelche SQL-Exceptions aber zumindest das ein Ticket o.ä. nicht erstellt werden konnte.

Da die Clientmethoden ja abfragen ob der server true oder false liefert, kann man die Fehlermeldung ja hardcodiert einfügen. If true -> nichts , else -> (in Methode ticketErstellen()) ticket konnte nicht erstellt werden.

Meine Frage bezieht sich ledeglich darauf, wie man es am besten Lösen kann, entweder in jeder Methode eine hartcodierte Fehlermeldung für die jeweilige Methode z.B. create, update usw oder ein MessageSystem mit Rückgabe von Events welche vom Client ausgelesen werden koennen.
 

0plan

Bekanntes Mitglied
Das ist eine nette Idee. Ich würde also z.B. eine statische Klasse ErrorMessage erstellen und diese interpretieren?
 

Michael...

Top Contributor
Die Methoden liefern einen int zurück. z.B:
0 - Methode fehlerfrei durchlaufen
1 - Ticket konnte nicht angelegt werden
2 - fehlende Berechtigung
...
Der Client muss dann eine Liste oder ähnliches haben/kennen die Fehlermeldung zur Zahl enthält. Eine Lösung mittels statischer Klasse wäre da denkbar.
 
S

Spacerat

Gast
Also ich halte die Entscheidung immer wie folgt: Wieviele Informationen passen in ein Bit (boolean)? Richtig: Nur zwei. In eine Message passen dagegen viel viel mehr, unter anderem auch "TRUE" und "FALSE". Ergo macht die Rückgabe boolscher Werte nur dann Sinn, wenn zu keiner Zeit (aktuell oder in zukünftigen Erweiterungen) mehr als zwei Werte zustande kommen können, z.B. bei simplen Statusabfragen wie "isRunning()" oder "isActive()". Ich würde daher grundsätzlich von vorneherein erstmal ein Messagesystem verwenden, wenn eine Methode allem anschein nach zukünftig mehr Informationen bereitstellen könnte, wie in deinem Fall.
@Michael: Eine statische Klasse ist schon was... wenn man's übertreiben will, lässt sie sich evt. sogar noch als externer Dienst implementieren, der gestartet wird, sobald er von einer Anwendung benötigt wird und beendet, wenn die letzte Anwendung, die ihn benötigt geschlossen wird. MAW.: Ein Port, der dynamisch für alle laufenden JVMs verfügbar ist und sozusagen einfache Inter-Prozess-Kommunikation ermöglicht. Über so etwas grüble ich schon jahrelang nach.
[EDIT]Das zuletzt von mir erwähnte, führt an dieser Stelle natürlich zu weit, weil es selbst ja bereits eine Client-Server-Komunikation darstellt. Ist mir nur zu spät aufgefallen. :oops:[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

0plan

Bekanntes Mitglied
Danke für eure Antworten, ich werde es mit einer statischen Klasse "ErrorMessage" lösen. Thread wird geschlossen.
 

FArt

Top Contributor
Thread wird geschlossen.

Wieso?

Ich finde das ist eine sehr suboptimale Lösung. Java bietet von sich aus eine sinnvolle Möglichkeit mit Fehlern umzugehen: Exceptionhandling. Warum jetzt davon abweichen? Nur weil zufällig Remote-Kommunikation dazwischen liegt?
Advantages of Exceptions (The Java™ Tutorials > Essential Classes > Exceptions)

Für Fehler sollte es wohldefinierte Ausnahmen, geben, die an passender Stelle behandelt werden.

Ein Punkt kann sein, was in diesem Fehler als Information enthalten ist. Es ist nicht sinnvoll, die Exceptions des Servers als Cause anzuhängen. Es kann sein, dass die Exception auf dem Client als Klasse gar nicht vorhanden ist. Ausserdem ist das immer auch ein Sicherheitsproblem, weil auf der Clientseite zu viele Informationen über die Serverseite zu sehen sind. Hier kann ein Fehlercode durchaus sinnvoll sein, während die komplette Exception auf der Serverseite geloggt wird. Das kann durchaus die statische "ErrorMessage" Klasse Verwendung finden.
 
T

tuxedo

Gast
Kann FArt zur zustimmen. Der korrekte weg wäre, am Server dedizierte Exceptions zu werfen. Diese gehören dann zur Interfacebeschreibung und sollten, wie die Interface-Klassen auch, dem Client bekannt sein.

Allerdings stellen Exceptions "Ausnahmen" dar, weswegen man Exceptions nicht für alles benutzen sollte, sondern nur für Ausnahmen. Ein Negativ-Beispiel wäre eine "LoginSuccessfulException" zu werfen wenn der Login geklappt hat.

Bzgl. Fehlercode: Man kann Exceptions auch einen wieder auslesbaren Fehlercode verpassen. Und ja: Tieferliegende Serverexceptions sollte man NICHT an den Client weiterreichen.

- Alex
 

FArt

Top Contributor
Allerdings stellen Exceptions "Ausnahmen" dar, weswegen man Exceptions nicht für alles benutzen sollte, sondern nur für Ausnahmen.

Ja, das hatte ich noch vergessen. Hier unterscheiden wir uns eben nicht von "normalem" Java Code. Somit gilt es natürlich auch, die gleichen Anti-Pattern zu vermeiden, z.B. Exception-Handling Antipatterns | Java.net

Ausnahme ist eben Log-And-Throw an der Servergrenze.
 
S

Spacerat

Gast
@Fart & tuxedo: Euch ist schon klar, dass Exception-Handling nur innerhalb einer Anwendung greift? Der Server stellt einen Fehler bei der Verarbeitung der Anforderung fest, sei es durch Exceptions oder fehlerhafte Rückgabewerte. Irgendwie muss das jetzt dem Clienten mitgeteilt werden und das geht nicht per Exception sondern nur per Übermittlung von Messages oder simplen Fehlercodes. Ob der Client aufgrund einer erhaltenen Fehlerrückmeldung seinerseits 'ne Exception wirft ist dann Sache des Entwicklers. Ich nehme mal an, ich hab' euch in euren Ausführungen nur missverstanden und ihr wolltet blos sagen, dass man Exceptions keinesfalls einfach serialisieren sollte, obwohl sie Serializable implementieren.
 
T

tuxedo

Gast
@Spacerat

Im Fall vom RPC/RMI/SIMON/... definiert sich die Schnittstelle zwischen Client und Server durch die "Remote-Interfaces". Diese dürfen sehr wohl Exceptions beinhalten.
Natürlich ist es Blödsinn ein Server-Interface beim Login eine JPA-Irgendwas-Exception an den Client weiterreichen zu lassen. Es spricht aber nix dagegen selbst eine "LoginFailedException" anzulegen und diese im Falle eines fehlgeschlagenen Logins zu werfen und folglich auch dem Client direkt mitzuteilen. Diese Exception ist damit Teil der Schnittstellendefinition zwischen Client und Server. Eben so, wie die Remote-Interfaces auch.

Wer will kann, bleiben wir beim Beispiel Login, noch weitere Exceptions werfen. Ein Beispiel:

LoginProcessFailedException -> Es trat ein Fehler im Server auf, weswegen der Login fehl schlug (Details ggf. in abfragbarem Error-Code). Beispielsweise war der interne LDAP nicht erreichbar oder so.
AuthenticationFailed -> Der angegebene Benutzer konnte nicht authentifiziert werden.
...

Aber in Remote-Verbindungen, welche auf beiden Seiten Java einsetzt, das ganze jetzt ausschließlich auch Error-Codes laufen lassen und vielleicht sogar nicht auf Client-Seite wieder zurück in eine Exception zu übersetzen.. Das ist IMHO Blödsinn.

Wenn man aber kein RMI und Co benutzt, sondern z.B. ein eigenes Protokoll implementiert: Dann wäre ein Error-Code unter Umständen sinnvoller als eine Exception zu serialisieren.

Ausnahmen bilden Libraries die selbst einen RPC Mechanismus darstellen :) Die kommen i.d.R. nicht drum rum Exceptions in irgend einer Art und Weise zu serialisieren und deserialisieren.

Aber selbst wenn man kein RPC selbst programmiert könnte es sinnvoll sein eigene Exception-Klassen für die Remote-Schnittstelle zu definieren und diese zu serialisieren. Wohlgemerkt: "könnte" ...

- Alex
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Dezimalzahl -> Hexadezimalzahl [Lösungsweg gesucht] Allgemeine Java-Themen 2
K Brauche euren Lösungsweg zu einem File/IO-Beispiel Allgemeine Java-Themen 23
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
E Server Client Audio Allgemeine Java-Themen 6
E Server Client Audio Allgemeine Java-Themen 0
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
C Java RMI Client - Server Allgemeine Java-Themen 0
S Simples Client Server Setup in Java Allgemeine Java-Themen 4
M JVM: Client Software Logging und Profiling aktivieren Allgemeine Java-Themen 1
OnDemand REST Client programmierens Allgemeine Java-Themen 4
J Soap Client mit mehreren URLs in Servlets Allgemeine Java-Themen 0
T Google Distance Matrix API Hello World/ Client Secret Allgemeine Java-Themen 3
C Hang Man Server Client Allgemeine Java-Themen 3
C Hang man mit Server/Client Allgemeine Java-Themen 2
M OOP IRC Client Allgemeine Java-Themen 3
B Web-Anwendung funktioniert mit Java 1.8, aber nicht mit Java 1.7 (auf Client) Allgemeine Java-Themen 5
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Allgemeine Java-Themen 3
P CXF 3.0.1 WebService- Client Allgemeine Java-Themen 0
M Checksummenprüfung bei Client Server kommunikation Allgemeine Java-Themen 3
B Java Mail Client als Outlook ausgeben Allgemeine Java-Themen 2
Z Java E-Mail Client mit End-to-End-Verschlüsselung Allgemeine Java-Themen 4
E Socket Client-Server-Programmierung Allgemeine Java-Themen 44
T Java Streaming-Server & Streaming-Client Allgemeine Java-Themen 4
D Client / Server Allgemeine Java-Themen 23
M HTTP Client Zertifikat sicher übertragen? Wie? Allgemeine Java-Themen 2
eskimo328 Swing Client Anwendung für MAC OS (Update Routine) Allgemeine Java-Themen 6
Z Threads Thread für einen Client Allgemeine Java-Themen 9
J Zugriff auf Poker-Client Fenster Allgemeine Java-Themen 14
G REST Client / URL Parser Allgemeine Java-Themen 2
S Java Kommandozeilen - Client Allgemeine Java-Themen 3
T JPA Entity im Client-Server-Umfeld Allgemeine Java-Themen 19
M Client für einen Webservice erstellen (ONVIF) Allgemeine Java-Themen 3
B mehrere services in einem client Allgemeine Java-Themen 10
D Versuch Server - Client anwendung Allgemeine Java-Themen 9
T Welcher Server? JSP und Client-Anwendung Allgemeine Java-Themen 4
MQue Server- Thread Client Allgemeine Java-Themen 2
D design client server Allgemeine Java-Themen 10
O binärer Suchbaum mit client server., objekte speichern. Allgemeine Java-Themen 2
F Java Server VM/ Client VM Allgemeine Java-Themen 7
J JSP Client LInk einbauen Allgemeine Java-Themen 15
J Client Allgemein Allgemeine Java-Themen 10
V Ausführung Client- oder Serverseitig? Allgemeine Java-Themen 13
A Client/Server-Anwendung Allgemeine Java-Themen 3
T Proxys: Idee für den Callback vom Server zum Client? Allgemeine Java-Themen 3
S SMTP-Limit bei Newsletter-Client Allgemeine Java-Themen 5
thE_29 Simpler FTP Client Allgemeine Java-Themen 3
G Performance Problem bei der Übertragung Server zum Client Allgemeine Java-Themen 3
J java vnc client verbessern: KeyEvent.VK_ALT keine Wirkung? Allgemeine Java-Themen 12
E NT-Anmeldung in Java Client-Applikation nutzen. JAAS ? Allgemeine Java-Themen 5
T einen SVN- oder QVCS-Client selber programmieren Allgemeine Java-Themen 2
M Tool zum autom. Client-Update Allgemeine Java-Themen 2
M kennt jemand nen gute email client in java mit imap? Allgemeine Java-Themen 3
H Datenbank an ein Java Client Server Programm anschliessen Allgemeine Java-Themen 3
A Was ist bei einem Servlet beim Client notwendig? Allgemeine Java-Themen 22
D ldap zugriff mit Java Client Allgemeine Java-Themen 2
A Daten-Synchronisation Client <-> Datenquelle (DB) ? Allgemeine Java-Themen 6
G Servlet - "Client immer am neuesten Stand" Allgemeine Java-Themen 2
G EMail Client Allgemeine Java-Themen 7
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
Jose05 Speicherung auf einem Server Allgemeine Java-Themen 1
D Live-Scripting im Server Allgemeine Java-Themen 6
Monokuma Threadproblem mit Sockets und Server Allgemeine Java-Themen 7
T imagej-server NullPointerException Allgemeine Java-Themen 1
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
B Datei/Ordner auf Server zugreifen/erstellen Allgemeine Java-Themen 2
M TomEE auf Windows Server 2016 installieren Allgemeine Java-Themen 4
bueseb84 Git : Mehrere Server verwenden Allgemeine Java-Themen 3
P Am Application Server - Selbe files aber trotzdem CNF Allgemeine Java-Themen 2
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
J Java - hoher Ramverbraucht auf WTS Server Allgemeine Java-Themen 8
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
C Logfile upload zu einem externen filezilla sftp server Allgemeine Java-Themen 6
K Server mieten, Berechnungen darauf ausführen Allgemeine Java-Themen 14
Anfänger2011 Java Server oder lieber was anderes Allgemeine Java-Themen 16
F Best Practice Server und Clients Allgemeine Java-Themen 10
E JavaFX RMI extrem langsam wenn Server nicht läuft Allgemeine Java-Themen 5
D Best Practice Java Application Server , Docker oder was? Allgemeine Java-Themen 15
L Suche nach CalDav Server API Allgemeine Java-Themen 0
K Classpath JDBC Driver auf Server Allgemeine Java-Themen 4
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
I Installer, der JAVA EE Server und DB installiert Allgemeine Java-Themen 10
M Kapselung JasperReports Server und Java Allgemeine Java-Themen 5
P Java Fehler auf Win2008 Server java.io.FilePermission IE8 Version JRE 1.7.0_51 Allgemeine Java-Themen 7
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
C Mit Pc Awendungen auf Server starten Allgemeine Java-Themen 8
B Input/Output Server Startet, Jedoch Kein Output. Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
R Fragen zu Server + UI Allgemeine Java-Themen 2
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
U AWT simulierter Tastendruck auf Virtual Server Allgemeine Java-Themen 7
Z Socket [Chatprogramm] Nachrichten vom Server anzeigen lassen Allgemeine Java-Themen 6
E Methoden Server Benutzer abfrage Allgemeine Java-Themen 2
N COM Server ansteuern / KISSsoft Allgemeine Java-Themen 3
N URLConnection - Server abgeschaltet Allgemeine Java-Themen 2
A Parser verursacht Speicherprobleme auf Server Allgemeine Java-Themen 2
T Mit Java auf Dateien zugreifen die auf einem Server liegen Allgemeine Java-Themen 5
J Problem beim Auslesen einer Datei vom Server Allgemeine Java-Themen 4
T jar Archiv auf Server ausführen Allgemeine Java-Themen 3
J Application Server Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben