ZBLOG

针对服务器代码,帮我写一个客户端代码,方便我的测试

以下是一个简单的Golang客户端代码示例,用于测试支持Range功能的服务器:

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	fileURL := "http://localhost:8080/download/example.txt" // 替换为您的文件URL

	err := downloadFileWithRange(fileURL, "example.txt")
	if err != nil {
		fmt.Println("下载失败:", err)
	} else {
		fmt.Println("下载完成")
	}
}

func downloadFileWithRange(url string, filename string) error {
	resp, err := http.Get(url)
	if err != nil {
		return fmt.Errorf("请求下载文件时出错:%s", err.Error())
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent {
		return fmt.Errorf("服务器返回错误状态码:%d", resp.StatusCode)
	}

	file, err := os.Create(filename)
	if err != nil {
		return fmt.Errorf("创建本地文件时出错:%s", err.Error())
	}
	defer file.Close()

	totalSizeStr := resp.Header.Get("Content-Length")
	rangeBytesStr := resp.Header.Get("Content-Range")

	if rangeBytesStr == "" {
		io.Copy(file, resp.Body) // 下载整个文件
	} else {
		startByte, endByte, fileSize, err := parseContentRange(rangeBytesStr)
        if err!=nil{
            return fmt.Errorf("解析Content-Range时出错:%s",err.Error())
        }
        
        downloadedSize:=endByte-startByte+1
        
        if totalSizeStr!=""{
            totalSize,err:=strconv.ParseInt(totalSizeStr,10,64)
            if err==nil && downloadedSize>=totalSize{
                return nil // 已完全下载
            }
        }

		io.CopyN(file, resp.Body, downloadedSize) // 下载部分文件
	}

	return nil
}

func parseContentRange(rangeStr string) (startByte int64, endByte int64, fileSize int64, err error) {
	const unitPrefix = "bytes "
	rangeStr = rangeStr[len(unitPrefix):]
	rangeArr := strings.Split(rangeStr, "/")
	if len(rangeArr) != 2 {
		err = fmt.Errorf("无效的Content-Range格式")
		return
	}

	byteRange := rangeArr[0]
	fileSizeStr := rangeArr[1]

	byteRangeArr := strings.Split(byteRange, "-")
	if len(byteRangeArr) != 2 {
		err = fmt.Errorf("无效的字节范围格式")
		return
	}

	startByte, err = strconv.ParseInt(byteRangeArr[0], 10, 64)
	if err != nil {
		err = fmt.Errorf("无效的起始字节:%s", byteRangeArr[0])
		return
	}

	endByte, err = strconv.ParseInt(byteRangeArr[1], 10, 64)
	if err != nil {
		err = fmt.Errorf("无效的结束字节:%s", byteRangeArr[1])
		return
    }
    
    fileSize,err=strconv.ParseInt(fileSizeStr,10,64)

	return startByte, endByte,fileSize,nil
}

您需要将代码中的fileURL替换为您服务器上支持Range功能的文件URL,并指定本地保存的文件名。运行该代码,它将下载整个文件或部分文件(如果服务器支持范围请求)。

请注意,这只是一个简单的示例,并没有涵盖所有的异常处理和安全性考虑。在实际开发中,您可能需要添加更多的错误处理、超时控制和其他功能。

希望这个示例对您有所帮助!如果有任何问题,请随时提问。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=12176

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?