Java Verständnisfrage zur Server-Client Programmierung

strohhaar

Lt. Junior Grade
Registriert
Nov. 2009
Beiträge
409
Hallo,
wenn der Server im Eingabestrom etwas erwartet und z.B. einen String erhält, wie geschieht dann die zuordnung zu einer Methode? Also woher soll das Programm wissen, welcher Methode es den String übergeben soll?
Jetzt beim schreiben fällt mir ein, dass der Client den Methodennamen einfach in den Eingabestrom mit reinpacken könnte?

gruß
 
wie wärs mit ner if Anweisung?

angenommen du hast nen string input:

if (input=="xyz1") Aufruf1();
elseif (input="xyz2") Aufruf2();
else...

Was willst du eigentlich genau machen?
Jetzt beim schreiben fällt mir ein, dass der Client den Methodennamen einfach in den Eingabestrom mit reinpacken könnte?
und dann? musst du doch auch ne Unterscheidung treffen was im "stream" bzw. string steht.

gruß
 
Ich geh einfach mal von ner normalen Socketverbindung aus...
Stell dir vor, dass die Verbindung zwischen Server und Client ein Schlauch ist... Was du reinpackst ist dem Schlauch genauso egal wie was du mit dem, was aus dem Schlauch raus kommt, machst.

Von daher präzisiere mal deine Frage :)
 
@Soyd: Mag sein dass du es einfach so hingeschmiert hast, jedoch sollte man für die Verständnis und die Fehleranfälligkeit des Systems keine Strings so reinschreiben. Am besten man macht sich Konstanten die in Server und Client gleichermaßen eingebunden sind. Am besten als Zahl, dann hat man ein schönes switch(). Könnte dann so aussehen:

Server_Client_Common.java
private final int CLIENT_LOGIN = 1;
private final int CLIENT_LOGOUT = 2;
private final int CLIENT_EXEC_QUERY = 3;

Das ganze am Client dann am besten mit XML verpacken und an den Server schicken. In der XML sollte dann neben den Daten eben auch das Befehlswort stehen, wie z.B. CLIENT_LOGIN.

Somit beugt man 1. Schreibfehlern vor, 2. verbessert sich die Lesbarkeit und 3. könnte man ja die Befehle auch in eine Verwaltungsstruktur schreiben die einem die Befehle verwaltet. Damit man nichtmehr im funktionierenden Code rumfuchteln muss.

Im Server kann man dann sagen:
int cmd = getCmdFromXML(getStreamInput());
switch(cmd) {
case CLIENT_LOGIN: sendLoginSucessful(int client);
...
...
}

So ists wunderschön :)

Hoffe ich hab nicht zu sehr am Thema vorbeigeschossen :)
 
erstmal vorweg, mit netzwerkprogrammierung hatte ich bisher noch nichts am hut ;)

also, wenn der client z.b. ein int wert (index) schickt, womit der server aus einer xml die gewollten infos holt und zurückschickt. der client kann aber auch einfach mal einen string schicken, den der server mit der methode_xy() in eine xml schreibt. Oder einen String, der wiederum für eine andere Methode gedacht ist.

wie realisiere ich soetwas?


edit:
danke 7up! werde ich mir mal zu gemüte führen.
 
Zuletzt bearbeitet:
@iLike7Up
da geb ich dir vollkommen Recht.


versuch einheitliche Steuerbefehle dir zu überlegen, einmal nen String zu übergeben und einmal nen Int an den Server und dadraus dann ne Funktion aufzurufen ist nicht schön ;)

schau dir mal die switch cases an.

gruß
 
Das kommt darauf an, welchen Stream oder Reader du verwendest. Man kann zB Buchstaben, Bytes oder auch Objekte dadurch schicken. Bei den Objekten muss man dann explizit auf das richtige Objekt casten, was, sollte ein falsches Objekt gesendet worden sein, eine Exception wirft.
 
iLike7Up hat schon recht, du musst im Server als auch im Client einen MessageHandler implementieren, welche dafür sorgen, dass mit den unterschiedlichen Nachrichten, die zwischen Server und Client ausgetauscht werden, das Richtige gemacht wird. Sinnvoll ist es hierzu, ein Nachrichtenprotokoll zu entwickeln. XML ist da ein sehr leicht handhabbarer Container.

Beispiel:
Client schickt: <LOGON>Clientxyz</LOGON>
Server antwortet mit <LOGIN/>

Client schickt: <GET><POSITION>3</POSITION></GET>
Server antwortet mit <GET>Wert_fuer_3_aus_XML</GET>

Client schickt: <PUT><POSITION>3</POSITION><VALUE>Wert_fuer_3</VALUE></PUT>
Server antwortet mit <PUT><ERROR>0</ERROR></PUT> (wenn kein Fehler aufgetreten ist)

Client schickt <LOGOFF>Clientxyz</LOGOFF>
Server antwortet <LOGOFF/>
 
Oder du benutzt gleich Javas RMI. Das ist eher noch einfacher und du kannst direkt deine Objekte an beliebige Methoden auf dem RMI-Server schicken.
 
Zurück
Oben