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
3131

被折叠的 条评论
为什么被折叠?



