很長一段時間以來,我一直在努力在 Android 應用程序中處理 TFTP 協議。其主要功能是從托管 TFTP 服務器的定制設計設備下載文件。我正在瀏覽互聯網,希望找到一些好的、已經編寫好的實現。首先,我嘗試使用 TFTP 庫,它是 Apache Commons 的一部分。不幸的是沒有運氣 - 不斷超時甚至完全凍結。經過進一步研究,我在 github 上找到了一些代碼 -請看一下。我已經采用了 Android 代碼,經過一些調整,我終于收到了一些文件。該設備的創建者表示,塊大小應該正好是 1015 字節。所以我將包大小增加到1015并更新了創建讀取請求包的方法:DatagramPacket createReadRequestPacket(String strFileName) { byte[] filename = strFileName.getBytes(); byte[] mode = currentMode.getBytes(); int len = rOpCode.length + filename.length + mode.length + 2; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(len); try { outputStream.write(rOpCode); outputStream.write(filename); byte term = 0; outputStream.write(term); outputStream.write(mode); // "octet" outputStream.write(term); outputStream.write("blksize".getBytes()); outputStream.write(term); outputStream.write("1015".getBytes()); outputStream.write(term); } catch (IOException e) { e.printStackTrace(); } byte[] readPacketArray = outputStream.toByteArray(); return new DatagramPacket(readPacketArray, readPacketArray.length, serverAddr, port);}正在下載塊,但有一個主要問題 - 我下載的文件是分成幾部分的,每個部分 512kB(除了最后一個),而我在 Android 設備上收到的每個部分大約大 0.5kB??雌饋砗孟衩看味嘁粋€字節或者多一整個附加。顯然我不完全理解它并且我錯過了一些東西。
1 回答

至尊寶的傳說
TA貢獻1789條經驗 獲得超10個贊
我知道出了什么問題。這種奇怪的行為是收到最后一個數據包時這一行的結果:
byte[] fileDataBytes = pktFactory.getDataBytes(dPkt);
返回的數組大小始終等于指定的數據包長度,即使接收到的數據較小。在我的例子中,最后一個數據包是 0 字節(tftp 為 +4 字節),但即便如此,額外的 512 字節還是添加到了輸出流中。
為了解決這個問題,我使用額外的參數重載了提到的方法 - 當接收到的數據大小高于 4 字節且低于指定的數據包大?。?12 字節)時,接收到的數據包的實際大小。此更改導致獲得最后一個數據包的數組的正確大小,因此接收到的文件在操作結束時具有正確的大小。
添加回答
舉報
0/150
提交
取消