2016-04-25 5 views
0

Ich habe ein einfaches Dateiübertragungsprogramm geschrieben, das eine TCP - Verbindung zu einem Server öffnet, die Bedingungen der Dateiübertragung (über TCP) aushandelt und die Datei vom Client an die Server. Das Problem ist, dass große Dateien fast immer beschädigt sind. Ich habe den Socket InputStream und OutputStream geloggt und festgestellt, dass, während die Daten zuerst übereinstimmen, nach einigen Kilobyte eine interessante Desynchronisierung auftritt.Socket Bulk Reading ergab ein Array von Nullen

An einem bestimmten Punkt beginnt der empfangende Socket 0 zu lesen, während der sendende Socket weiterhin die Dateidaten sendet.

Beispiel:

Server: ..., -75, 82, 34, -109, 50, -51, 52, 9, -14, -70,... 
Client: ..., -75, 82, 34, -109, 50, 0, 0, 0, 0, 0,... 

jedoch Nach ein wenig erholt es

..., 0, 0, 0, 0, 0, -51, 52, 9, -14, -70,... 

Sie werden feststellen, es wieder, wo sie aufgehört haben. Das einzige Problem ist jetzt, dass ich eine Reihe von Nullen in meiner Datei habe und das Ende des Streams nicht in der Datei aufgezeichnet wird (da die Dateilänge im Voraus gesendet wird).

HINWEIS: dies scheint nur einen Teil der Zeit (mehr als oft nicht)

Der Streaming-Code selbst passieren:

Sender:

<header stuff, I checked it works fine> 

long dataLeft = 0; 
while(dataLeft < packet.payloadSize){ 
    packet.remaining = packet.payloadSize-dataLeft; 
    byte[] temp = new byte[packet.remaining<8192?(int)packet.remaining:8192]; 
    packet.inStream.read(temp); 
    stream.write(temp); 
    dataLeft+=temp.length; 
} 

stream.flush(); 

<Rest of the code> 

Empfänger:

public boolean streamPayload(OutputStream out) throws IOException{ 
    long dataLeft = 0; 
    while(dataLeft < payloadSize){ 
     remaining = payloadSize-dataLeft; 
     byte[] temp = new byte[remaining<8192?(int)remaining:8192]; 
     inStream.read(temp); 
     out.write(temp); 
     dataLeft+=temp.length; 
    } 
    return true; 
} 

long dataLeft a cts als der Index btw.

Weiß jemand, warum dies passieren könnte und wie ich es beheben/das Problem beheben kann? Ich weiß, dass ich nicht sagen kann, ob eine Null gemeint ist, also kann ich nicht einfach auf das Problem hören, indem ich die Ausgabe ansehe.

+0

Da alle Sende-/Empfangsfunktionen weniger als die angeforderte Anzahl von Bytes senden/empfangen können. Zum Beispiel kann 'inStream.read (temp)' weniger als 'temp.length' Anzahl von Bytes lesen. Also sind die Schwanzelemente dieses Arrays gleich Nullen. – gudok

+0

Da ist mein Problem. Vielen Dank! – pop1040

Antwort

2

Ich weiß nicht, ob dies Ihr Problem lösen wird, aber eine Sache, die Sie falsch machen, ignoriert die Menge der übertragenen Daten.

InputStream in = //from somewhere 
OutputStream out = //to somewhere 
byte[] buffer = new byte[8192]; 
int read = -1; 
while ((read = in.read(buffer)) > -1) { 
    out.write(buffer, 0, read); 
} 
out.close(); 
int.close(); 

Sie könnten Daten liest, ohne dass zu empfangen und dann das Schreiben 8192 Byte-Puffer, die leer ist, weil Sie nicht überprüfen, ob etwas durchkam.

+1

Das ist mit ziemlicher Sicherheit die richtige Antwort. OP: Wenn Sie den Rückgabewert von 'in.read()' ignorieren, * werden * Sie Ihre Daten korrumpieren. – markspace

+0

DANKE! Ich sehe, ich kann verlangen, dass es einen 8K Puffer füllt, aber es füllt es möglicherweise nicht den ganzen Weg. DANKE NOCHMAL. – pop1040