BufferedOutputStream schreibt nicht alles in eine Datei
-
12-12-2019 - |
Frage
Ich versuche, einen TFTP-Server zu erstellen, aber wenn er eine Datei empfängt, scheint nicht alles auf dem Server gespeichert zu sein (einige Bytes fehlen).Die Datei wird einwandfrei erstellt und der Großteil der Daten wird geschrieben, aber da die Datei nicht vollständig ist, wird sie als beschädigt und nicht öffenbar eingestuft.Weiß jemand, wie man dieses Problem behebt?
Hauptklasse
WRQ WRQ = new WRQ();
ACK ACK = new ACK();
DatagramPacket outPacket;
BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream(filename));
byte[] bytes;
byte[] fileOut;
outPacket = WRQ.firstPacket(packet);
socket.send(outPacket);
socket.receive(packet);
while (packet.getLength() == 516){
bytes = WRQ.doWRQ(packet);
bufferedOutput.write(bytes);
outPacket = ACK.doACK(packet);
socket.send(outPacket);
socket.receive(packet);
}
bytes = WRQ.doWRQ(packet);
bufferedOutput.write(bytes);
bufferedOutput.close();
outPacket = ACK.doACK(packet);
socket.send(outPacket);
WRQ-Klasse
public class WRQ {
public DatagramPacket firstPacket(DatagramPacket packet) throws IOException{
ACK ACK = new ACK();
DatagramPacket ACKpacket = ACK.doACK(packet);
//takes ACK packet and sets block # as 0 to signal that this is the first packet in a WRQ
byte[] ACKcontents = new byte[3];
ACKcontents = ACKpacket.getData();
ACKcontents[2] = 0;
ACKcontents[3] = 0;
ACKpacket.setData(ACKcontents);
return ACKpacket;
}
public byte[] doWRQ(DatagramPacket packet){
int length = packet.getLength();
byte[] packetData = packet.getData();
byte[] data = new byte[length - 4];
data = Arrays.copyOfRange(packetData, 4, length - 4);
return data;
}
}
Lösung
Dieser Code sieht für mich sehr verdächtig aus:
byte[] packetData = packet.getData();
byte[] data = new byte[length - 4];
data = Arrays.copyOfRange(packetData, 4, length - 4);
Ihr Ausgabearray (Daten) hat eine Länge length - 4
, aber du kopierst nur length - 8
bytes dazu.Wenn die in packetData zu ignorierenden Bytes die ersten 4 Bytes sind, sollte es sein
data = Arrays.copyOfRange(packetData, 4, length);
weil das letzte Argument keine Länge ist, sondern die to
index (exklusiv).Sehen das Javadoc Einzelheiten.