# Thread und Sockets...



## quiqum (2. Apr 2009)

Hallo Zusammen!

Ich habe ein funktionierende Socket Anwendung geschrieben (d.h. eigentlich zwei: Server, Client). Über eine einfache GUI wählt der Client die Datei aus und schickt sie ab. Der Server empfängt diese und speichert Sie am entsprechenden Ort ab. Die Einstellungen (also Host, Speicherort, Password für Server, etc) sind in einer einfachen ConfigFile. 
Meine Frage ist nun, ob es das einen gewissen Standart gibt (oder einfach Wege die man sicher nicht braucht), um so eine Socketanwendung zu schreiben. 

Ich habe folgende Methode gebraucht:

1. Der Client öffnet eine Socket Verbindung. InputStream, OutputStream werden erstellt. InputStream an ein Thread gegeben, das alle Daten einliest und diese in eine PipedOutputStream schreibt und von einer PipedInputStream gelesen werden kann. Dafür gibt es eine Methode GetLine, damit man gleich eine ganze Zeile einlesen kann (Wäre hier ein BufferedReader von Vorteil?). 
2. Jetzt folgt die Begrüssung (also HELLO, HELLO). Dann fragt der Server nach dem FILENAME und der Client sendet diesen brav. Der Server ist dabei so eingestellt (bzw. eine Funktion), dass er nach 100 Zeichen aufhört zu lesen, um einen Überlauf zu vermeiden. (deshalb kein BufferedReader). 
3. Erst jetzt fragt der Server nach dem Passwort. (komisch, ich weiss). 
4. Nach erfolgreichen Authentication sendet der Server "START" was den Client auffordert, die Datei zu senden. Gleichzeitig wird Sie dann vom Server mit einem FileOutputStream die entsprechende Datei geschrieben (bzw. erstellt). Nach Abschluss der Übertragung sagen sich die beiden noch freundlich "BYE". 
5. Jetzt wird die Verbindung beendet.

Ich hätte auch den Code posten können, aber das wäre peinlich und leider wegen eines internen Reglementes auch verboten.

Was hab ich da alles "falsch" gemacht? Was kann man verbessern? (also hauptsächlich zum Protokoll, Ablauf, Programmierung sekundär)


----------



## ice-breaker (4. Apr 2009)

Wie wäre es ein Teil des FTP-Protokolls dafür zu implementieren?
Ist, wenn ich deine Anwendung richtig verstanden habe, genau das passende.


----------



## Gast2 (5. Apr 2009)

quiqum hat gesagt.:


> 1. Der Client öffnet eine Socket Verbindung. InputStream, OutputStream werden erstellt. InputStream an ein Thread gegeben, das alle Daten einliest und diese in eine PipedOutputStream schreibt und von einer PipedInputStream gelesen werden kann. Dafür gibt es eine Methode GetLine, damit man gleich eine ganze Zeile einlesen kann (Wäre hier ein BufferedReader von Vorteil?).


ich kenne jetzt nciht die Piped-Streams (will auch im Moment nicht in die API schauen -> WE) ... aber wenn ich "GetLine" und "ganze Zeilen einlesen" sehe, falsche Streams ... verwende etwas was nur Bytes verwendet ... ansonsten kannst Du nur Text-Dateien ohne Probleme übertragen



> 2. Jetzt folgt die Begrüssung (also HELLO, HELLO). Dann fragt der Server nach dem FILENAME und der Client sendet diesen brav. Der Server ist dabei so eingestellt (bzw. eine Funktion), dass er nach 100 Zeichen aufhört zu lesen, um einen Überlauf zu vermeiden. (deshalb kein BufferedReader).


wieso so ein kleiner Puffer? ... per Default sind das glaub ich 8kByte ... und welchen Überlauf ... Du hast (a) Java und (b) kann man die Länge der empfangenen Zeichen aus "messen"



> Was hab ich da alles "falsch" gemacht? Was kann man verbessern? (also hauptsächlich zum Protokoll, Ablauf, Programmierung sekundär)



bis auf die eigenwillige Reihenfolge mit dem Passwort - ok ... ansonsten würde ich mich ice_breaker anschließen

hand, mogel


----------

