卷毛丢弃最后5个字节,但wget可以正常工作

时间:2018-09-12 03:00:48

标签: java curl kotlin wget

我有一个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可以正常工作,但是我很好奇为什么会首先出现此问题。

1 个答案:

答案 0 :(得分:2)

根据wget文档,它支持http和ftp协议。你在做什么都不是。它完全可以工作的事实很可能是因为它们以适合您的某种特殊方式处理不兼容的http服务器。

如果您想做自己想做的事情,则至少可以在文件内容的前面放置一个伪造的HTTP响应:

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