Konzeptionelle Ausarbeitung einer synchronen Kommunkation (Server/Client))

Status
Nicht offen für weitere Antworten.
"hello world!" :)

Ich mache mir im Moment darüber Gedanken, wie ich die grundsätzliche synchrone Kommunikation zwischen dem Server und dem Client programmiere.

Das heißt, es soll nicht einfach ein klassisches Request/Reply Ding werden, sondern es soll auch vom Server Anfragen bzw. Anweisungen bekommen können. Es gibt also immer 2 Arten von Incoming Objects: einmal die Antworten vom Server und einmal Serveranfragen. Wenn ich jetzt lokal irgendwo ein Request an den Server schicke, dann muss ich auch mit
Java:
new ObjectInputStream().readObject()
auf eine Antwort warten.

Aber wie kann ich jetzt unterscheiden, ob es sich um eine Antwort oder um eine Anfrage des Servers handelt? Per se kann ich anhand des Objektes natürlich schon unterscheiden, was der Server nun will, aber soll ich jedes mal nach einem readObject() abfragen, ob es das oder das ist?... kennt jmd. vll. eine elegante und pfiffige Lösung.
 
T

tuxedo

Gast
Elegante Lösung? RMI, SIMON und Konsorten ...

"Eigene Lösung": Ein Protokoll entwickeln.

Du könntest alle Objekte mit einem Basisinterface versehen, mit welchem man Informationen zum Objekt erfragen kann.

Bsp:

Java:
public interface BasisMessageObject {

public void MyTypeEnum getType();

}

Dann kannst du alle Objekte erstmal nach "BasisMessageObject" casten, damit dann nach dem genaueren Typ fragen, und dann anhand des Typs in das eigentliche Interface casten.

Um das "Abfragen" kommst du nicht wirklich drum rum. Natürlich gibts auch noch andere vorangehensweisen. Du könntest VOR dem eigenltichen Objekt auch einen Integer schicken (Data*Stream), welcher dann deinen Objekt-Typ identifiziert.

Aber generell gilt: Immer alles serialisieren und casten ist nicht gut/schnell. SIMON und RMI haben da eine etwas verfeinerte Technik.

Bei Spielen ist es wohl besten, ganz auf Serialisierung zu verzichen und ein Binäres Protokoll aufzusetzen. Das spart Bandbreite und ist sehr schnell.

Bei klassischen Client/Server Desktopanwendungen würde ich sowas wie RMI oder SIMON einsetzen. Denn wozu das Rad nochmal neu erfinden?

- Alex
 
Das wird wohl eine eigene Lösung werden, da "vieles" bereits vorhanden ist. Das Interface z.B. existiert bereits bei mir als BasisProtokollKlasse und je nach Zweck leitet eine Klasse von der BasisProtokollKlasse ab, wobei die Idee mit dem Interface vll. besser wäre..?!?

Ich werde erstmal versuchen es auf diese Weise zu implementieren: Jedes mal, wenn in einem GUI-Element eine Serveranfrage "ausgelöst" wird, wird eine synchronized sendObject() Methode aufgerufen, die erstmal generisch das passende ProtokollObjekt bastelt und verschickt und dann auch auf die Antwort wartet.. Wenn die Antwort zufällig keine Antwort, sondern eine Servernachricht (oder so) ist, wird das Objekt weitergeleitet (wo es hin soll) und sendObject() wartet dann weiter auf die Antwort.... ne Laufnummer hat das Protokoll auch schon, falls eine eindeutige Identifikation gebraucht wird.

Und nebenläufig läuft ein Thread der auf Serveranfragen wartet, falls mal sendObject() nicht läuft. ... Ich hoffe es klappt.. dürfte einige Zeit dauern.

Denn wozu das Rad nochmal neu erfinden?

aus Spass. :D
 
T

tuxedo

Gast
Würde das etwas anders angehen, zumindest von der Struktur her:

Ich würde eine zentrale Empfangsinstanz machen. Also einen Thread, der nix anderes tut als Objekte empfangen, jedes empfangene Objekt grob zu betrachten und dann zu entscheiden was damit zu tun ist.

Wenn du wie du sagst bereits eine Laufnummer hast, ist die Ideal um die Objekte entsprechend zuzuordnen.

Wird eine Serveranfrage ausgelöst wird das entsprechende Anfrageobjekt versendet. Der Methodenaufruf ist dann aber noch nciht zuende... Die Methode "schläft" (wait-Mechanismus) bis der Empfangsthread etwas empfangen hat was eine Antwort ist. Wen der Empfangsthread "wecken" (notify) muss, ergibt sich aus der Laufnummer und dem Objekttyp.

So in der Art ist auch SIMON intern aufgebaut....

- Alex
 
Könntest du dir vorstellen, dass der oben von mir beschriebene Ansatz funktioniert (nicht das ich mich da verrenne).
also die zentrale Empfangsinstanz hab ich mehr oder weniger auch... nur das es nicht möglich sein dürfte, dass dieser Thread ein Reply bekommt, weil das Warten auf so einen Reply mutual exclusive in der Methode sendObject wäre. Dadurch bräuchte ich auch kein Wait() oder notify(), da die Funktion new ObjectInputStream().readObject() solange wartet bis die Antwort kommt........:bloed:

dann würde doch das ganze Programm stehen bleiben, bis das Object angekommen ist ? Dann lass ichs lieber.

Der Ansatz von SIMON klingt vielversprechend.Kennst du zufällig die Klasse (vll. ungefähre Stelle) wo die
Empfangsinstanz ein notify macht und eine Stelle, wo exemplarisch eine Methode ein wait() ausführt...so dass ich das direkt :rtfm: kann..., also die Interaktion nachvollziehen kann?
 
T

tuxedo

Gast
Dein Ansatz hört sich so an, als ob da viel zu viel synchronisiert wird und am Ende nicht "schnell" ist. Ist aber nur so'n Bauchgefühl.

Die "Empfängerklasse" in SIMON ist die Klasse "Dispatcher". Da gibt es eine Methode die eingehende Nachrichten entgegen nimmt.

Die Nachricht wird dann in einen ProcessorPool geworfen wie sie analysiert und weitergereicht wird. Ein Pool deshlab, damit bereits die nächste Nachricht gelesen werden kann.

Jede ausgehende Nachricht hat einen "Monitor" der zum schlafen und wecken genutzt wird. Eine eingehende Antwort wird anhand der Sequenz-ID zum wecken des Monitors genutzt. Der geweckte Methodenaufruf holt sich dann in einer Result-Liste SEIN Result ab.

Fertig.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
N Link aus einer E-Mail aufrufen Netzwerkprogrammierung 2
N Name eines Attributes aus einem festen String und einer Variablen generieren Netzwerkprogrammierung 5
O HTTP Einloggen auf einer Homepage Netzwerkprogrammierung 8
H Daten auf einer Webseite eintragen Netzwerkprogrammierung 11
Z Debug-Info einer JavaSE Applikation auf Webserver Netzwerkprogrammierung 0
S HTTP Würdet Ihr Euch bei einer intern genutzten Anwendung auf Cookies verlassen? Netzwerkprogrammierung 2
J Hilfe beim programmiern einer App zur Anmeldung im Wlan-Netzwerk Netzwerkprogrammierung 0
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
D Überwachen einer SMB-Freigabe bei Änderungen im Dateisystem Netzwerkprogrammierung 0
L FTP Lesen einer Datei vom Server - Aufgehangen Netzwerkprogrammierung 0
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
L Ratschlag zur Umsetzung einer client-server-Kommunikation Netzwerkprogrammierung 6
O HTTP Zugriff und Aktionen auf einer Webseite ausführen Netzwerkprogrammierung 9
S Automatischer Login auf einer Webseite Netzwerkprogrammierung 12
D JavaMail: HTML Code einer Mail Netzwerkprogrammierung 9
H Daten an Textfeld einer Webseite schicken Netzwerkprogrammierung 2
D Aus einer URL die Dateien lesen Netzwerkprogrammierung 5
Dit_ RMI RMI-Server und gleichzeitiger Aufruf einer Methode Netzwerkprogrammierung 14
T Ladezeit einer Seite mit HttpURLConnection und Bildern Netzwerkprogrammierung 2
M bild von einer url erzeugen Netzwerkprogrammierung 7
V Quelltaxt einer Website auslesen funktioniert nicht Netzwerkprogrammierung 2
V Angezeigten Text einer Website erfragen Netzwerkprogrammierung 4
P HttpClient - Daten einer Website "unvollständig" Netzwerkprogrammierung 5
A HTTP Download einer Datei mit "Statistiken" Netzwerkprogrammierung 2
S Port auf einer bestimmten IP-Adresse auslesen? Netzwerkprogrammierung 6
S netzwerkprotokoll auf basis einer tcp verbindung erstellen Netzwerkprogrammierung 9
G Kryptische Zeichen beim Auslesen einer Website Netzwerkprogrammierung 11
Ollek Download einer Datei durch SFTP mit Java Netzwerkprogrammierung 12
B Frage zu einer Lösung (RMI) Netzwerkprogrammierung 2
H HTTP Einloggen auf einer HTML (php) Seite Netzwerkprogrammierung 6
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
L Größe einer Datei auslesen die im Netz liegt Netzwerkprogrammierung 4
DeviAn Über ein Linux Server ein Windows Server nach einer File fragen Netzwerkprogrammierung 6
F Entwicklung einer Software zur Steuerung und Überwachung von Netzwerkgeräten Netzwerkprogrammierung 4
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
C Problem mit Übertragung einer Klasse in RMI Netzwerkprogrammierung 10
A attachment einer Mail speichern Netzwerkprogrammierung 5
C Dateigröße einer Datei im Internet ermitteln Netzwerkprogrammierung 2
J programm zum autom. ausdruck einer webseite Netzwerkprogrammierung 2
E Parameter einer URLConnection Netzwerkprogrammierung 12
G Unvollständiges Laden einer Seite Netzwerkprogrammierung 2
M Rechner einer Domäne auslesen? Netzwerkprogrammierung 3
KNeuhaus (Windows) Authentication VON einer Java-App aus. Netzwerkprogrammierung 2
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
D Content einer email in sql-datenbank speichern Netzwerkprogrammierung 9
M RMI direkte Verbindung mit einer Mysql datenbank Netzwerkprogrammierung 13
T Quelltext einer Website auslesen Netzwerkprogrammierung 3
ven000m Frage aus einer mündl. Prüfung - wer kennt die Antwort? Netzwerkprogrammierung 6
J Funktion zum Maskieren der Sonderzeichen einer URL Netzwerkprogrammierung 2
J Zeilenweises auslesen aus einer Datei über Server Netzwerkprogrammierung 6
C RMI: Problem beim Aufruf einer Methode. Falsch gecastet? Netzwerkprogrammierung 8
D Problem beim holen einer PHP-Seite via HttpClient Netzwerkprogrammierung 19
C IP adresse anhand einer domain adresse auslesen / ermitteln Netzwerkprogrammierung 3
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
V Zuweisen einer InetAddress mit einem byte Netzwerkprogrammierung 5
D Anmelden an einer Windows-Domäne Netzwerkprogrammierung 2
M Suche Klasse um Paramater zu einer URL hinzuzufügen. Netzwerkprogrammierung 3
B Url-Link aus einer E-Mail aufrufen Netzwerkprogrammierung 2
M Quellcode einer HTML Seite erhalten Netzwerkprogrammierung 2
A Abbruch einer Verbindung erkennen? Netzwerkprogrammierung 3
G Performance einer verteilten RMI-Anwendung Netzwerkprogrammierung 4
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
clemson Größe einer Heruntergeladenen Datei Netzwerkprogrammierung 10
O Problem bei Überprüfung und Spliten von einer IP! Netzwerkprogrammierung 2
R Änderung einer Seite (Klasse URL) Netzwerkprogrammierung 2
I IP Adresse des Clients einer Socket Verbindung Netzwerkprogrammierung 2
G Redirects einer HttpURLConnection ermitteln Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben