GO语言实现文件的断点续传
生活随笔
收集整理的這篇文章主要介紹了
GO语言实现文件的断点续传
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要簡單實現一個發送文件的端點續傳功能,主要解決在傳輸過程中客戶端斷開后在重新取得連接后可在之前的傳輸基礎上進行繼續傳輸,直到文件傳輸完畢。
客戶端
package mainimport ("fmt""io""net""os""strconv""time" )func clientRead(conn net.Conn) int{buf := make([]byte, 10)n, err := conn.Read(buf)if err != nil {fmt.Println("conn.Read err:", err)}off, err := strconv.Atoi(string(buf[:n]))if err != nil {fmt.Println("strconv.Atoi err:", err)}return off }//發送數據 func clientWrite(conn net.Conn, data []byte){_, err := conn.Write(data)if err != nil {fmt.Println("conn.Write err:", err)}fmt.Println("寫入數據:", string(data)) }func clientConn(conn net.Conn) {defer conn.Close()clientWrite(conn, []byte("start-->"))off := clientRead(conn)fp, err := os.OpenFile("file.txt", os.O_RDONLY, 0777)if err != nil {fmt.Println("os.OpenFile err:", err)}defer fp.Close()_, err = fp.Seek(int64(off), 0)if err != nil {fmt.Println("Seek err:", err)}for{data := make([]byte, 10)n, err := fp.Read(data)if err != nil {if err == io.EOF{time.Sleep(time.Second)//clientWrite(conn, []byte("<--end"))fmt.Println("文件發送結束!")break}}//time.Sleep(time.Second)clientWrite(conn, data[:n])} }func main(){conn, err := net.DialTimeout("tcp", "127.0.0.1:8848", time.Second*10)//conn, err := net.Dial("tcp", "127.0.0.1:8848")if err != nil {fmt.Println("Dial err:", err)}clientConn(conn) }服務端
package mainimport ("fmt""io""net""os""strconv" )//追加 func WriteFile(content []byte){if len(content) > 0{fp, err := os.OpenFile("file_out.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0777)if err != nil {fmt.Println("OpenFile err:", err)}defer fp.Close()_, err = fp.Write(content)if err != nil {fmt.Println("fp.Write err:", err)}fmt.Println("fp.Write ok")} }//判斷文件是否存在 func getFileState() int64{stat, err := os.Stat("file_out.txt")if err != nil {if os.IsNotExist(err){fmt.Println("文件不存在")return 0}}return stat.Size() }func serverConn(conn net.Conn){defer conn.Close()for true {var buf = make([]byte, 10)n, err := conn.Read(buf)if err != nil {if err == io.EOF{fmt.Println("server is EOF")return}fmt.Println("conn.read err:", err)return}fmt.Println("收到數據:", string(buf[:n]))switch string(buf[:n]) {case "start-->":off := getFileState()stroff := strconv.FormatInt(off, 10)_, err := conn.Write([]byte(stroff))if err != nil {fmt.Println("conn.Write err:", err)}continue//case "<--end":// fmt.Println("文件寫入完畢!")// return}WriteFile(buf[:n])} }func main(){listen, err := net.Listen("tcp", "127.0.0.1:8848")if err != nil {fmt.Println("net.Listen err:", err)}fmt.Println("正在監聽...")defer listen.Close()conn, err := listen.Accept()if err != nil {fmt.Println("Accept err:", err)}serverConn(conn) }總結
以上是生活随笔為你收集整理的GO语言实现文件的断点续传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Harbor2.2.1配置(trivy扫
- 下一篇: kubenetes中YAML的字段解释