針對大檔案網路傳輸易中斷、重傳成本高的問題,本文實作一套「客戶端分割 → 逐塊發送 → 伺服端組裝」的斷點續傳機制,並在網路中斷時自動暫停、恢復後續傳。
static 區域變數與全域變數記錄:檔案總大小、塊數、已發送/接收位移、最後一塊大小。Client->Active,若連線中斷則重試連線;接收端以 TMemoryStream 累積資料,最後 SaveToFile 並載入 TImage 驗證(範例為 BMP)。// 發送端 OnWrite 事件
void __fastcall TForm1::ClientWrite(TObject *Sender, TCustomWinSocket *Socket) {
static long sent = 0, total, block = 20000, lastBlock;
static TMemoryStream *ms = new TMemoryStream();
if (firstCall) { ms->LoadFromFile(filename); total = ms->Size; lastBlock = total % block; firstCall = false; }
if (sent < total - lastBlock) {
ms->Position = sent;
char buf[20000]; ms->ReadBuffer(buf, block);
Socket->SendBuf(buf, block);
sent += block;
// 每塊發送後主動斷開/重連模擬網路不穩(範例簡化)
Client->Active = false; Client->Active = true;
} else { // 最後一塊
ms->Position = sent;
char buf[20000]; ms->ReadBuffer(buf, lastBlock);
Socket->SendBuf(buf, lastBlock);
sent = total; // 完成
}
}
// 接收端 OnClientRead 事件
void __fastcall TForm1::ServerClientRead(TObject *Sender, TCustomWinSocket *Socket) {
static TMemoryStream *ms = new TMemoryStream();
static long received = 0, total, block = 20000, lastBlock;
char buf[20000];
int len = Socket->ReceiveBuf(buf, block);
ms->WriteBuffer(buf, len);
received += len;
if (received >= total) {
ms->SaveToFile("d:\\k.bmp");
ms->Position = 0;
Image1->Picture->Bitmap->LoadFromStream(ms);
}
}
TMemoryStream 作為記憶體緩衝區,支援隨機存取(Position)與串流轉存。void*,需手動管理讀寫位移。此架構可延伸為 FTP 斷點續傳、大檔案分片上傳、分散式檔案同步等核心模組。