Dateitransfer - kein end of stream

shizar

Neues Mitglied
Ich will vom Client eine Datei zum Server übertragen, das funktioniert auch! aber leider wartet der Server im read() nach dem ende der übertragung! (also er erhält kein end of stream) weis einer von euch warum?

Senden der Daten:

Java:
	int len = 0;
	while ((len = is.read(buffer)) > 0) // Auslesen der Datei und...
	{
		out.write(buffer, 0, len); //...Senden (Out ist ein OutputStream)
	}

Empfangen der Daten:

Java:
while ((byteCounter = in.read(buffer)) > 0) //in. ist ein InputStream
{
	os.write(buffer, 0, byteCounter); //os. Ist ein FileOutputStream
}

Also beim Empfangen wartet er im "in.read(buffer)" bis ein Timeout auftritt (durch setSoTimeout gesetzt), obwohl dmie Datei bereits vollständig übertragen ist!

Den Socket will ich aber noch nicht schließen, da ich dem Client noch eine Antwort schicken will (erfolgreich empfangen, oder eben eine Fehlermeldung...)
Also nach dem Senden der Datei wartet der Client in einem read() auf eine antwort, läuft aber auch in ein Timeout da der Server keine antwort sendet (wartet ja noch im read())
was mache ich falsch?
danke :)
 
Zuletzt bearbeitet:

Ariol

Top Contributor
Versuch mal nach dem Senden zu flushen.

Evtl. kannst du auch den OutputStream schließen und erhälst einen neuen gültigen bei getOutputStream(), dass ist aber nur eine Idee.
 

Kr0e

Gesperrter Benutzer
Du machst nichts falsch, sondern für dein Vorhaben einfach nur zu wenig ;)

Was du brauchst wären Metadaten. Also Daten über die Daten die du sendest. Wie wäre es mit einem 5-Byte - Header:

Java:
    byte[] buffer = new byte[8192];

    buffer[0] = 0x01; //Das kannst du dir dann ja überlegen..

    int len = 0;
    while ((len = is.read(buffer, 5, buffer.length-5)) > 0) // Auslesen der Datei und...
    {
        //Schnell die Größe in den Header packen
        writeIntToByteArra(len); // Hab grad keine Lust dieses Byteverschieben auszuformulieren^^ 

        // Len + 5 weil dein Header byte groß ist: 1 byte Packetbeschreibung also in dem Fall 0x01 bedeutet, dass gleich ein Stück der Datei kommt..
        // Und ein int (4 byte) der die länge des datenblocks angibt...
        out.write(buffer, 0, len + 5); //...Senden (Out ist ein OutputStream)
    }

Wenn nun deine Datei fertig ist kannst du z.B. 0x02 als Byte-Flag schicken und dann auf der Gegenseite dieses sehr einfache Protokoll auswerten...

Also: STichwort: Protokoll!

Gruß,

Chris
 

shizar

Neues Mitglied
Danke für Antwort!
hmm sowas wie ein Protokoll habe ich bereits, allerdings nicht mit Headern, sondern mit "out.write(int)" realisiert!, also der Server wartet auf eine verbindung und erhält eine integer Zahl, und anhand von der weiß er nun welche daten kommen, und empfängt diese dann, da er weis das zur zahl 12 die Daten X mit der länge 45Byte kommen (habe vordefinierte Nachrichtenlängen). Hmm was haltet ihr Prinzipiell von diesem System? Vielleicht doch besser nur mit Headern realisieren? ist das was ich mache in der Netzwerkkommunikation verpönt? kenne mich was diese richtung was die Konventionen betrifft nicht so super aus!
Bei Datein funktioniert dieses system eben nicht, da diese keine feste Länge besitzen. Bei Dateien wäre aber glaube ich ein 8Byte Header besser.. Integer.Max_VALUE könnte ein bisschen klein für große Dateien sein (auch wenn zu 99,9% nur kleine Datein (<5MB) verschickt werden sollen...
 

Kr0e

Gesperrter Benutzer
Ähm, ich war eben in Eile, besser wäre folgendes: Schreib am Anfang bevor du die Datei versendest eine long Zahl (8 byte) die die Gesamtgröße der Datei beschreibt. Der andere PC weiß dann, wann er aufhören muss zu lesen. Man kanns auch mit Headern machen, aber ist garnicht mal notwendig ;) So ist vorallem sichergestellt, dass der andere PC weiß wieviel kommt und kann dann ne PRogressbar anzeigen oder so ;)

GRuß,

CHris
 
G

Gelöschtes Mitglied 5909

Gast
Übrigens ist die korrekte abbruchbedingung der while schleife != -1 und nicht > 0

// edit 2

übrigens hast du das problem auch nur dann, wenn die verbindung nach dem dateitransfer geöffnet bleibt. Ob das gewünscht ist musst du wissen. Protokolle wie ftp machen die kommunikation und den datentransfer über unterschiedliche kommunikationskanäle (sockets)
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Socket SCP - Dateitransfer mi KeyFile Netzwerkprogrammierung 6
M Socket, Ende Dateitransfer Netzwerkprogrammierung 4
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
T Zugriffsverweigerung nach Dateitransfer Netzwerkprogrammierung 7
W fehlerhafte Datei nach Dateitransfer per ServletOutputStream Netzwerkprogrammierung 2
M Socket kein Input Netzwerkprogrammierung 8
P Warum kann ich kein Socket aufbauen? Netzwerkprogrammierung 12
4 Socket Kann kein ServerSocket erstellen Netzwerkprogrammierung 4
R RMI Kein "rmiC.exe" vorhanden, lediglich "rmiD.exe" Netzwerkprogrammierung 5
V Socket kein "aktives warten" Netzwerkprogrammierung 10
T XML-RPC kein Zugriff auf Server Interface Netzwerkprogrammierung 3
S FTP ich find kein anfang - generelle sachen Netzwerkprogrammierung 2
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
E Socket Werte mit DataInput- und Output- Stream übergeben Netzwerkprogrammierung 1
T MP3 Dateien Stream Netzwerkprogrammierung 3
C Byte Stream dekodieren Netzwerkprogrammierung 7
G Video aus RTSP Stream speichern Netzwerkprogrammierung 8
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
A versch. Daten im Stream erkennen Netzwerkprogrammierung 2
E stream speichern Netzwerkprogrammierung 5
M RTP Stream überprüfen... Netzwerkprogrammierung 4
K ein Thread pro Stream Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
B Pdf Stream von Servlet mit itext Netzwerkprogrammierung 12
K End of stream, BufferedInputStream Netzwerkprogrammierung 4
A Icecast / SHOUTcast MP3 Stream / icy-metaint Netzwerkprogrammierung 3
Kr0e Simpler HTTP Stream server Test Netzwerkprogrammierung 3
H String Array durch einen Stream schicken. Netzwerkprogrammierung 4
lacyuu Warum empfängt mein Stream keinen Input? Netzwerkprogrammierung 4
lordcarlos Erstes TCP programm - output stream problem Netzwerkprogrammierung 2
dayaftereh Bester Stream für ein Spiel? Netzwerkprogrammierung 15
N Socket Stream Schicken Netzwerkprogrammierung 13
N Socket Stream in String Netzwerkprogrammierung 4
M Bytes aus Stream lesen Netzwerkprogrammierung 3
J byte[] auf Stream schreiben Netzwerkprogrammierung 2
M ich habe ein stream problem Netzwerkprogrammierung 7
S Schnellster Stream Netzwerkprogrammierung 20
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
W Was für ein Stream soll ich verwenden? Netzwerkprogrammierung 8
F Stream wird als Char übertragen. Char -> in String umwand Netzwerkprogrammierung 5
A java.io.StreamCorruptedException: invalid stream header Netzwerkprogrammierung 2
C invalid stream header Netzwerkprogrammierung 2
T Stream de-multiplexen Netzwerkprogrammierung 2
J gzip Stream weiterleiten Netzwerkprogrammierung 3
m@nu Ende von Stream bei HTTP-Request Netzwerkprogrammierung 3
C Problem mit Object-Stream Netzwerkprogrammierung 3
N TCP Stream auslesen Netzwerkprogrammierung 7
André B. Stream Bridge? Netzwerkprogrammierung 2
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
T Musik-Stream: Server sendet die Datei zu schnell ? Netzwerkprogrammierung 3
N InternetRadio-Stream umleiten Netzwerkprogrammierung 2
G Writer oder Stream bei Socket? Netzwerkprogrammierung 2
G Datei über HTTP Stream senden Netzwerkprogrammierung 4

Ähnliche Java Themen


Oben