BufferedOutputStream pas écrit tout de fichier
-
12-12-2019 - |
Question
J'ai essayer de créer un serveur TFTP, mais lorsqu'il reçoit un fichier, il semble que pas tous, il est enregistré sur le serveur (quelques octets sont manquantes).Le fichier est créé fine et la majorité des données est écrit, mais que le dossier n'est pas complet, il est considéré comme corrompu et unopenable.Quelqu'un sait-il comment résoudre ce problème?
classe principale
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 classe
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;
}
}
La solution
Ce code semble très suspect pour moi:
byte[] packetData = packet.getData();
byte[] data = new byte[length - 4];
data = Arrays.copyOfRange(packetData, 4, length - 4);
Votre tableau de sortie (données) est de longueur length - 4
, mais vous vous contentez de copier length - 8
octets pour elle.Si les octets à ignorer dans packetData sont les 4 premiers octets, il devrait être
data = Arrays.copyOfRange(packetData, 4, length);
parce que le dernier argument n'est pas une longueur, mais le to
index (exclusif).Voir la javadoc pour plus de détails.