Curl 丢弃最后 5 个字节,但 wget 工作正常

Curl drops last 5 bytes but wget works fine

我有一个 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 file.jar

真实且可能相关的事情:

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

jar 文件已在主机上创建。

通过 scp 发送 jar 文件也可以正常工作并生成未损坏的文件。

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

此行为是 100% 可重复的:它总是恰好丢失 5 个字节,仅适用于 jar 文件,无论我在多台接收方计算机上尝试过。

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

根据 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));