【问题标题】:Curl drops last 5 bytes but wget works fine卷曲下降最后 5 个字节,但 wget 工作正常
【发布时间】:2025-12-09 07:45:01
【问题描述】:

我有一个 Kotlin 程序,我用它来向远程主机提供文件。我正在尝试使用 curl 在远程主机上获取文件。对于纯文本文件,这个程序对我来说很好,但对于 .jar 文件,它总是会丢失 5 个字节。另一方面,wget 可以正常工作并且不会丢失 5 个字节。

如果有用的话,这里是 Kotlin 代码

            val client = serverSocket.accept()
            val file = File(pathToFile)
            val bytes = ByteArray(16 * 1024)
            val instream = FileInputStream(file)
            val out = BufferedOutputStream(client.getOutputStream())

            var count: Int
            var sm = 0
            count = instream.read(bytes)

            while (count > 0) {
                sm += count
                out.write(bytes, 0, count)
                count = instream.read(bytes)
            }
            print("total bytes : $sm")
            out.flush()
            out.close()

这是我正在使用的 curl 命令和 wget 命令:

wget -O file.jar 1.2.3.4:5678

curl 1.2.3.4:5678 -o 文件.jar

真实且可能相关的事情:

宿主机(运行上面的kotlin代码)是windows机器,接收方是运行linux的。

jar 文件是在主机上创建的。

通过 scp 发送 jar 文件也可以正常工作,并导致文件未损坏。

无论使用 curl 还是 wget,kotlin 代码打印的总字节数都是正确的。

这种行为是 100% 可重复的:它总是缺少 5 个字节,仅适用于 jar 文件,无论我在多台接收机器上尝试过。

显然这不是一个大问题,因为仅使用 wget 就可以正常工作,但我很好奇为什么会首先出现这个问题。

【问题讨论】:

    标签: java curl kotlin wget


    【解决方案1】:

    根据 wget 文档,它支持 http(s) 和 ftp(s) 协议。你正在做的既不是。它完全起作用的事实很可能是因为它们以某种适合您的特定方式处理不兼容的 http 服务器。

    如果你想做你正在做的事情,你至少可以在文件内容前面放一个假的 HTTP 响应:

    out.write("HTTP/1.1 200 OK\r\nContent-type: application/octet-stream\r\n\r\n"
              .getBytes(StandardCharsets.US_ASCII));
    

    【讨论】:

    • 啊,有道理。我想我从来没有想过将 wget 和 curl 视为读取字节流之外的东西,因为这恰好是我想要的。谢谢!
    最近更新 更多