猿问

通过 TFTP 传输的文件与主机上传输的文件大小不同

很长一段时间以来,我一直在努力在 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。看起来好像每次多一个字节或者多一整个附加。显然我不完全理解它并且我错过了一些东西。


拉莫斯之舞
浏览 159回答 1
1回答

至尊宝的传说

我知道出了什么问题。这种奇怪的行为是收到最后一个数据包时这一行的结果:byte[] fileDataBytes = pktFactory.getDataBytes(dPkt);返回的数组大小始终等于指定的数据包长度,即使接收到的数据较小。在我的例子中,最后一个数据包是 0 字节(tftp 为 +4 字节),但即便如此,额外的 512 字节还是添加到了输出流中。为了解决这个问题,我使用额外的参数重载了提到的方法 - 当接收到的数据大小高于 4 字节且低于指定的数据包大小(512 字节)时,接收到的数据包的实际大小。此更改导致获得最后一个数据包的数组的正确大小,因此接收到的文件在操作结束时具有正确的大小。
随时随地看视频慕课网APP

相关分类

Java
我要回答