# Client Server Kommunikation



## nathaniells freak (12. Februar 2008)

Hallo Coders.

Ich will eine Client Server Kommunikation aufbauen mit einem Server in der mitte, der die Unterhaltung kontrollieren kann und ich somit die administration für den JS - Java Server und den mit ihm verbundenen DBS - Datenbank Server handeln kann. Der Client heisst hier JC - Java Client.


 Ziel meiner programmiererei soll sein:
--------------------------------------------------------
- das wenn der Client Daten abrufen will per SELECT vom DBS, dann soll er indirekt mit diesem reden dürfen über den JS. Mir geht es hier um die Sicherheit des DBS und das keiner im Netzwerk so leicht den DBS finden kann, zwecks Angriffs-Unterbindung.
- Administration von Benutzern, Anfragen, Überwachen von Anfragen und Protokollieren, ...
(die ganze Palette halt)
- Auswertbares sql.Resultset oder ähnliches auf dem JC haben


 Das Modell:
-------------------
#########     ----1.)------>    #########     ----2.)----->    #########
#----JC----# <=======> #----JS----# <=======>#---DBS--#
#########     <---3.)------   #########     <---3.)------    #########

1.) Ist die Anfrage des JC - Java Clients an den JS - Java Server
2.) Ist die Weiterleitung der Anfrage an den DBS - Datenbank Server
3.) Ist die Antwort des DBS an JS
4.) Ist die Antwort des JS's auf die Anfrage des JC's

Kann ich das über RMI lösen?
Kann man das java.sql.ResultSet über "serializable" in einen Bytestrom umwandeln und wieder zurück?
Hat jemand eine Idee wie ich das adäquat lösen kann laut der vorgegebenen Ziele?

Cu Micha


----------



## shutdown (12. Februar 2008)

> Kann ich das über RMI lösen?
> Kann man das java.sql.ResultSet über "serializable" in einen Bytestrom umwandeln und wieder zurück?
> Hat jemand eine Idee wie ich das adäquat lösen kann laut der vorgegebenen Ziele?



Grundsätzlich kannst du das über RMI lösen.
Die Frage ist nur, ob das so sinnvoll ist. Gerade wenn es dir um den Sicherheitsaspekt geht, gehe ich davon aus, dass du deine Daten bei der Übertragung verschlüsseln willst. Desweiteren möchtest du bei großen Datenmengen eventuell die Daten komprimieren. Und du möchtest vielleicht nicht, dass jemand, der den Netzwerk-Traffic mithört, dein Datenmodell (Namen der Tabellen und Views, Authorisierung der User usw) kennt.

Darum würde ich in diesem Fall eher zu einer Kommunikation über Sockets raten, da du hier die Datenströme direkter beeinflussen kannst - ist aber sicherlich Geschmackssache.

Resultset implementiert lt. Api NICHT das Interface Serializable - demzufolge kannst du es auch nicht übertragen. Es hindert dich aber niemand daran, das Resultset am JS weiterzuverarbeiten (ich hab für solche Fälle eine Klasse ResultRow geschrieben, die letztzlich einen Zeile des Resultsets in einer ArrayList aufnimmt. Dann eine ArrayList von Resultrows - und du kannst deine Daten serialisieren).
Evtl notwendige Meta-Infos kannst du dann auch extra mitschicken.

Die Benutzerverwaltung würde ich nicht am JS machen - da hat der DBS doch schon alles was man braucht. Für bestimmte Nutzer werden nur lesende Views eingerichtet, andere haben Schreibrechte auf die Original-Tabellen. Da solltest du nicht nochmal zwischenrein was hängen. Besonders, weil dein JS dann ja praktisch Adminrechte auf dem DBS hat - er muss ja alles machen können, um alle Anfragen bearbeiten zu können - und jetzt programmier mal einen Fehler in deinen JS, der in 100 Tagen deine wichtigsten Tabellen droppt.

Wenn dann würde ich dir vorschlagen, dass deine Benutzer sich am JS "anmelden" und dann geht der JS her und meldet sich mit denselben Daten für den Benutzer am DBS an - das Ganze natürlich in mehreren Threads, damit alle Nutzer mit ihren jeweiligen Rechten bedient werden können.


----------



## nathaniells freak (12. Februar 2008)

Danke für deine Antwort shutdown.

Die User senden ihre Zugangsdaten über Sockets an meinen JS. Diese sind Natürlich verschlüsselt. Der JS entschlüsselt diese und sendet dann wie du es gesagt hast: die Benutzerkennung User + Passwort des Users als Login an den Datenbank Server.

Desweiteren lasse ich die ganze Administration für die DB auf dem Datenbank Server. Der Java Server soll nur anzeigen wer ist online, er soll Anfragen kontrollieren das Daten nicht geändert werden können und wenn sie geändert werden sollen diese Änderungen auch protokolliert werden. Mit dem Server will ich abbilden das ein Benutzer sich am System anmelden darf oder nicht. Er dient zur Arbeit mit dem DB Server und dessen Einstellungen + zusätzliche Steuertabllen. In denen dann z.B. steht was protokolliert wird und was nicht. Eine Gruppen Einteilung wer darf welches Modul verwenden im Programm will ich realisieren. Die Steuerung will ich in der DB ablegen sowohl Gruppen als auch Benutzer nur bezogen auf die Oberfläche. Hier will ich auch die Beschriftung der Steuerelemente in der Datenbank ablegen mit mehreren Sprachen. Das bietet sich ja an, da man das ganze gut in einer DB realisieren kann.

Sicherlich würde ich gerne die Daten Verschlüsseln und Komprimieren. Da hast du schon recht. Aber ich will auch so wenig wie möglich Ressourcen auf dem Server belegen. Das ist ein anderer Aspekt den ich in betracht ziehe! 

Desweiteren habe ich keine Ahnung wie du die Umstellung eines java.sql.Reultsets auf Feld machen willst, da ja jede Anfrage anders sein kann und ich nicht für jede Anfrage eine SOLCHE Funktion schreiben will. Wenn du für diese Umwandlung Quellcode hast würde ich mich darüber freuen. Genauso Wenn du für die Verschlüsselung, das Komprimieren und Socket Verbindung Code hast oder empfehlenswerte Adressen wäre ich darüber auch nicht abgeneigt.

Nochmals danke shotdown

CU Micha


----------



## nathaniells freak (13. Februar 2008)

Wie würdest du arbeiten shutdown

Der Ablauf müsste so gehen:
-----------------------------------
1.) java.sql.Resultset umwandeln zu String Feld und die einzelnen Strings in einen Vektor einfügen
2.) String Felder serialisieren
----------------------------------- >> Bis hier hin ist mir der Ablauf klar
3a.) Verschlüsseln
4a.) Komprimieren

oder

3b.) Komprimieren
4b.) Verschlüsseln
-----------------------------------

Blähen sich die Daten beim Verschlüsseln auf?
Wenn wie stark? Hast du da Erfahrungswerte?


----------



## shutdown (13. Februar 2008)

Du musst das Resultset nicht notwendigerweise in Strings umwandeln, du kannst sie auch als Object lassen, aber wenn du sie später nur zum anzeigen brauchst, warum nicht.



> DeflaterOutputStream: Dies ist die Basisklasse für alle Klassen zur Datenkomprimierung.
> CheckedInputStream: Für jeden Eingabestrom InputStream liefert diese Klasse eine Prüfsumme mithilfe der Methode getCheckSum() zurück.
> CheckedOutputStream: Für jeden Ausgabestrom OutputStream liefert diese Klasse eine Prüfsumme mithilfe der Methode getCheckSum() zurück.
> ZipOutputStream: Dies ist eine Unterklasse von DeflaterOutputStream. Hauptzweck dieser Unterklasse ist die Komprimierung von Daten im ZIP-Format.
> ...



Zu Verschlüsselung mit Java gibt es viele Sachen. Einfach mal bei Google suchen. Ich persönlich würde dir ein asymmetrisches Verfahren wie RSA empfehlen, da du bei einem symmetrischen aus Pflegbarkeitsgründen wahrscheinlich nur einen Schlüssel für alle verwenden würdest.

Durch die Verschlüsselung wird ein im Normalfall geringer Overhead erzeugt. Die Verfahren sind darauf bedacht, nicht zusätzliche Information zu erzeugen, da diese für Kryptoanalytiker sehr interessant wären. Also sehe ich grundsätzlich kein Problem wierum du beim packen/verschlüsseln vorgehst.


----------

