客戶端傳送訊息詢問服務端,你上次接收到的檔案內容位置
服務端告訴客戶端上次接收到的檔案內容位置
客戶端就從上次斷點的位置繼續傳送檔案內容
客戶端傳送檔案內容完畢後通知服務端,然後斷開連線
下面我們看看**的實現
服務端// file name: server.go
package main
import (
"os"
"io"
"net"
"log"
"strconv"
// "time"
)// 獲取已接收內容的大小
// (斷點續傳需要把已接收內容大下通知客戶端從**開始傳送檔案內容)
func getfilestat() int64
log.fatalf("get file stat faild: %s\n", err)
}log.printf("file size: %d\n", fileinfo.size())
return fileinfo.size()
}func serverconn(conn net.conn)
log.fatalf("server read faild: %s\n", err)
}log.printf("recevice %d bytes, content is 【%s】\n", n, string(buf[:n]))
// 判斷客戶端傳送過來的訊息
// 如果是』start-->『則表示需要告訴客戶端從**開始讀取檔案資料傳送
switch string(buf[:n])
continue
case "<--end":
// 如果接收到客戶端通知所有檔案內容傳送完畢訊息則退出
log.fatalf("receive over\n")
return
// default:
// time.sleep(time.second * 1)
}// 把客戶端傳送的內容儲存到檔案
writefile(buf[:n])}}
func main()
defer l.close()
log.println("waiting accept.")
// 允許客戶端連線,在沒有客戶端連線時,會一直阻塞
conn, err := l.accept()
if err != nil
serverconn(conn)
}客戶端
// file name: client.go
package main
import (
"os"
"io"
"net"
"log"
"time"
"strconv"
)// 獲取服務端傳送的訊息
func clientread(conn net.conn) int
// string conver int
off, err := strconv.atoi(string(buf[:n]))
if err != nil
return off
}// 傳送訊息到服務端
func clientwrite(conn net.conn, data byte)
log.printf("send 【%s】 content success\n", string(data))
}// client conn
func clientconn(conn net.conn)
defer fp.close()
// set file seek
// 設定從**開始讀取檔案內容
_, err = fp.seek(int64(off), 0)
if err != nil
log.printf("read file at seek: %d\n", off)
for
log.fatalf("read file err: %s\n", err)
}// 傳送檔案內容到服務端
clientwrite(conn, data[:n])}}
func main()
clientconn(conn)
}實際應用的注意事項:
可限時記錄未上傳完的檔案,過時刪除,也可通過某個操作限制未上傳完的檔案儲存時間。
上傳完成的檔案要將檔名更改避免檔名重複
scrapy 斷點續爬
第一步 安裝berkeleydb資料庫 第二部 pip install bsddb3 第三部 pip install scrapy deltafetch 第四部 settings.py設定 spider middlewares deltafetch enabled true deltafetch e...
golang socket程式設計
go語言中通過net包中的dialtcp函式來建立乙個tcp連線,並返回乙個tcpconn型別的物件,當連線建立時伺服器端也建立乙個同型別的物件,此時客戶端和伺服器端通過各自擁有的tcpconn物件來進行資料交換。一般而言,客戶端通過tcpconn物件將請求資訊傳送到伺服器端,讀取伺服器端響應的資訊...
http range實現斷點續傳(斷點續載)
使用http range實現斷點續傳 伺服器端 響應的格式是 記錄檔案大小 long pastlength 0 int rangeswitch 0 long tolength 0 long contentlength 0 客戶端請求的位元組總量 string rangebytes 記錄客戶端傳來的形...