很長一段時間以來,我一直在努力在 Android 應(yīng)用程序中處理 TFTP 協(xié)議。其主要功能是從托管 TFTP 服務(wù)器的定制設(shè)計設(shè)備下載文件。我正在瀏覽互聯(lián)網(wǎng),希望找到一些好的、已經(jīng)編寫好的實現(xiàn)。首先,我嘗試使用 TFTP 庫,它是 Apache Commons 的一部分。不幸的是沒有運氣 - 不斷超時甚至完全凍結(jié)。經(jīng)過進一步研究,我在 github 上找到了一些代碼 -請看一下。我已經(jīng)采用了 Android 代碼,經(jīng)過一些調(diào)整,我終于收到了一些文件。該設(shè)備的創(chuàng)建者表示,塊大小應(yīng)該正好是 1015 字節(jié)。所以我將包大小增加到1015并更新了創(chuàng)建讀取請求包的方法: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 設(shè)備上收到的每個部分大約大 0.5kB??雌饋砗孟衩看味嘁粋€字節(jié)或者多一整個附加。顯然我不完全理解它并且我錯過了一些東西。
1 回答

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