很长一段时间以来,我一直在努力在 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 字节且低于指定的数据包大小(512 字节)时,接收到的数据包的实际大小。此更改导致获得最后一个数据包的数组的正确大小,因此接收到的文件在操作结束时具有正确的大小。
添加回答
举报
0/150
提交
取消