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));
我有一个 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));