golang 并发传文件 --客户端

package main

import (
   "bytes"
   "flag"
   "fmt"
   "io"
   "io/ioutil"
   "log"
   "net"
   "os"
   "strconv"
   "strings"
)

var fileC = make(chan int)
var numS []int
var host = flag.String("host", "", "Must specify saverhost example: 192.168.1.1:40000")

func main() {
   flag.Parse()
   if *host == "" {
      fmt.Printf("Must specify saverhost")
      return
   }
   os.Mkdir("tmp", os.ModePerm)
   conn, err := net.Dial("tcp", *host)
   if err != nil {
      panic(err)
   }
   buf := make([]byte, 100)
   conn.Read(buf)
   byte := bytes.Trim(buf, "\x00")
   config := string(byte)
   configarr := strings.Split(config, " ")
   fmt.Println(configarr)

   port, _ := strconv.Atoi(configarr[0])
   num, _ := strconv.Atoi(configarr[1])
   chunkSize, _ := strconv.Atoi(configarr[2])
   lastChunkSize, _ := strconv.Atoi(configarr[3])
   fileName := configarr[4]
   //ext := configarr[5]

   for i := 1; i <= num; i++ {
      chunk := chunkSize
      if i == num {
         chunk = lastChunkSize
      }
      go getData(i, port+i, chunk)
   }

   fmt.Println("======================")

   for {
      numS = append(numS, <-fileC)
      fmt.Println("==============================")
      fmt.Printf("整体已下载第 %.3f\\%", (float64(len(numS))/float64(num))*100)
      fmt.Println("==============================")
      if len(numS) == num {
         break
      }
   }
   close(fileC)

   //========合并文件=============

   allFile, err := os.OpenFile("tmp/"+fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm)
   if err != nil {
      panic(err)
   }
   for i := 1; i <= int(num); i++ {
      tmpFile, err := os.OpenFile("tmp/auto"+strconv.Itoa(int(i))+".db", os.O_RDONLY, os.ModePerm)
      if err != nil {
         panic(err)
      }
      b, err := ioutil.ReadAll(tmpFile)
      if err != nil {
         panic(err)
      }
      allFile.Write(b)
      fmt.Printf("合并进度%.3f/%\n", (float64(i)/float64(num))*100)
      tmpFile.Close()
   }
   allFile.Close()

}

func getData(num, addr, chunk int) {
   fmt.Printf("已开启第%v个并发\n", num)
   conn, err := net.Dial("tcp", fmt.Sprintf("192.168.28.57:%v", addr))
   if err != nil {
      panic(err)
   }
   tmpFileName := "tmp/auto" + strconv.Itoa(num) + ".db"

   buf := make([]byte, chunk)

   n, err := io.ReadFull(conn, buf)
   if err != nil {
      panic(err)
   }
   if n != chunk {
      log.Printf("长度不对,接收长度为:%v,期待长度为:%v, 发生在 %v", n, chunk, num)
   }
   tmpF, err := os.OpenFile(tmpFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
   if err != nil {
      panic(err)
   }
   tmpF.Write(buf)
   defer tmpF.Close()
   fileC <- num
}

转载于:https://my.oschina.net/wgc2010/blog/2876231

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值