سؤال

أحاول إنشاء خادم TFTP ولكن عندما يتلقى ملفًا يبدو أنه لم يتم حفظه بالكامل على الخادم (بعض وحدات البايت مفقودة).تم إنشاء الملف بشكل جيد وتمت كتابة غالبية البيانات ولكن نظرًا لأن الملف غير مكتمل، فقد تم تصنيفه على أنه تالف وغير قابل للفتح.هل يعرف أحد كيفية حل هذه المشكلة؟

الفئة الرئيسية

            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

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;

}

}
هل كانت مفيدة؟

المحلول

يبدو هذا الرمز مريبًا جدًا بالنسبة لي:

byte[] packetData = packet.getData();
byte[] data = new byte[length - 4];
data = Arrays.copyOfRange(packetData, 4, length - 4);

مجموعة الإخراج (البيانات) الخاصة بك طويلة length - 4, ، لكنك تنسخ فقط length - 8 بايت إليها.إذا كانت وحدات البايت المطلوب تجاهلها في packetData هي أول 4 بايتات، فيجب أن تكون كذلك

data = Arrays.copyOfRange(packetData, 4, length);

لأن الوسيطة الأخيرة ليست طولا، ولكن to الفهرس (حصريا).يرى جافادوك للتفاصيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top