日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GO语言实现文件的断点续传

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言实现文件的断点续传的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。