利用 Go 语言开发一个并发文件下载器
发布时间:2021-11-07 00:31:41 所属栏目:语言 来源:互联网
导读:今天给大家分享一个实战项目,涉及到的知识点还挺多,文末也有源码地址!! 原文如下: Go 语言是一门了不起的语言,尽管它非常简单,与 Koltin 和 Scala 等其他现代语言相比,它的功能很少,但它具有强大的并发能力。这篇文章,我们将会看到使用 Go 语言如何编
今天给大家分享一个实战项目,涉及到的知识点还挺多,文末也有源码地址!! 原文如下: Go 语言是一门了不起的语言,尽管它非常简单,与 Koltin 和 Scala 等其他现代语言相比,它的功能很少,但它具有强大的并发能力。这篇文章,我们将会看到使用 Go 语言如何编写一个完整的并发文件下载器。完整的代码在这里[1]。 检查服务器是否支持并发下载 如何之前使用过类似 IDM 的下载工具,你可能会注意到它支持并发下载文件。 可以看到下载文件的时候启动了 8 个进程。 实现并发下载,我们必须确保服务器支持范围请求。怎么确认呢?我们可以发送 HEAD 请求,如果响应头的 Accept-Ranges 返回的值是 bytes,我们就能确定服务器支持此功能。 res, err := http.Head("http://some.domain/some.file") if err != nil { log.Fatal(err) } if res.StatusCode == http.StatusOK && res.Header.Get("Accept-Ranges") == "bytes" { // Yeh, server supports partial request } 如何下载文件的其中一部分 设想服务器支持范围请求,我们知道文件大小是 4000 字节(文件大小从响应头的 Content-Length 获取)。要仅下载 2000 到 3000 字节的文件的一部分,我们可以发送 HTTP GET 请求,并在 header 头设置 Range 参数: curl -X GET -H "Range: bytes=2000-3000" -o OUTPUT_FILE http://some.domain/some.file 实现相同功能的代码如下: req, err := http.NewRequest("GET", "http://some.domain/some.file", nil) if err != nil { log.Fatal(err) } rangeStart := 2000 rangeStop := 3000 req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", rangeStart, rangeStop)) // make a request res, err := http.DefaultClient.Do(req) 将响应保存在文件中 为了支持断点续传功能,我们不会将请求响应保存在内存里,而是会持久化在文件中。举个例子,如果我们把并发级别设置成 4,在输出目录将会有 4 个临时文件。下面的代码,我们只是简单地读取 HTTP 响应体并将它写入一个文件中 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |