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.
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
Da ist mein Problem. Vielen Dank! – pop1040