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