ZBLOG

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

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

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "net/http"
  6. "os"
  7. )
  8. func main() {
  9. fileURL := "http://localhost:8080/download/example.txt" // 替换为您的文件URL
  10. err := downloadFileWithRange(fileURL, "example.txt")
  11. if err != nil {
  12. fmt.Println("下载失败:", err)
  13. } else {
  14. fmt.Println("下载完成")
  15. }
  16. }
  17. func downloadFileWithRange(url string, filename string) error {
  18. resp, err := http.Get(url)
  19. if err != nil {
  20. return fmt.Errorf("请求下载文件时出错:%s", err.Error())
  21. }
  22. defer resp.Body.Close()
  23. if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent {
  24. return fmt.Errorf("服务器返回错误状态码:%d", resp.StatusCode)
  25. }
  26. file, err := os.Create(filename)
  27. if err != nil {
  28. return fmt.Errorf("创建本地文件时出错:%s", err.Error())
  29. }
  30. defer file.Close()
  31. totalSizeStr := resp.Header.Get("Content-Length")
  32. rangeBytesStr := resp.Header.Get("Content-Range")
  33. if rangeBytesStr == "" {
  34. io.Copy(file, resp.Body) // 下载整个文件
  35. } else {
  36. startByte, endByte, fileSize, err := parseContentRange(rangeBytesStr)
  37. if err!=nil{
  38. return fmt.Errorf("解析Content-Range时出错:%s",err.Error())
  39. }
  40. downloadedSize:=endByte-startByte+1
  41. if totalSizeStr!=""{
  42. totalSize,err:=strconv.ParseInt(totalSizeStr,10,64)
  43. if err==nil && downloadedSize>=totalSize{
  44. return nil // 已完全下载
  45. }
  46. }
  47. io.CopyN(file, resp.Body, downloadedSize) // 下载部分文件
  48. }
  49. return nil
  50. }
  51. func parseContentRange(rangeStr string) (startByte int64, endByte int64, fileSize int64, err error) {
  52. const unitPrefix = "bytes "
  53. rangeStr = rangeStr[len(unitPrefix):]
  54. rangeArr := strings.Split(rangeStr, "/")
  55. if len(rangeArr) != 2 {
  56. err = fmt.Errorf("无效的Content-Range格式")
  57. return
  58. }
  59. byteRange := rangeArr[0]
  60. fileSizeStr := rangeArr[1]
  61. byteRangeArr := strings.Split(byteRange, "-")
  62. if len(byteRangeArr) != 2 {
  63. err = fmt.Errorf("无效的字节范围格式")
  64. return
  65. }
  66. startByte, err = strconv.ParseInt(byteRangeArr[0], 10, 64)
  67. if err != nil {
  68. err = fmt.Errorf("无效的起始字节:%s", byteRangeArr[0])
  69. return
  70. }
  71. endByte, err = strconv.ParseInt(byteRangeArr[1], 10, 64)
  72. if err != nil {
  73. err = fmt.Errorf("无效的结束字节:%s", byteRangeArr[1])
  74. return
  75. }
  76. fileSize,err=strconv.ParseInt(fileSizeStr,10,64)
  77. return startByte, endByte,fileSize,nil
  78. }

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

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

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?