C++Builder 內建網路元件 NMStrmServ (伺服端) 與 NMStrm (客戶端) 提供簡單高效的檔案傳輸功能,比 FTP 元件更輕量易用。本文完整示範雙邊實作程式碼。
NMStrmServ + SaveDialogNMStrm + OpenDialog + 目標 IP 輸入NMStrmServ1、SaveDialog1NMStrmServ1.Port (預設 1234 等)void __fastcall TForm1::NMStrmServ1Msg(TObject* Sender, TStream* Strm) {
if (SaveDialog1->Execute()) {
// 若檔案存在先刪除
if (FileExists(SaveDialog1->FileName))
DeleteFile(SaveDialog1->FileName);
TFileStream* fs = new TFileStream(SaveDialog1->FileName, fmCreate);
try {
fs->CopyFrom(Strm, Strm->Size); // 直接從網路流複製
ShowMessage(L"接收成功!儲存為:" + SaveDialog1->FileName);
} catch (...) {
ShowMessage(L"接收失敗!");
}
fs->Free();
}
}
NMStrm1、OpenDialog1、Button1 (Caption="發送檔案")Label1 (Caption="接收主機:")、Edit1 (Text="127.0.0.1")void __fastcall TForm1::Button1Click(TObject* Sender) {
if (OpenDialog1->Execute()) {
TFileStream* fs = new TFileStream(OpenDialog1->FileName, fmOpenRead);
try {
NMStrm1->Host = Edit1->Text; // 目標 IP/主機名
NMStrm1->FromName = L"NetMasters"; // 發送者識別
NMStrm1->PostIt(fs); // 非同步發送
ShowMessage(L"檔案 " + OpenDialog1->FileName + L" 發送成功!");
} catch (...) {
ShowMessage(L"檔案 " + OpenDialog1->FileName + L" 發送失敗!");
}
fs->Free();
}
}
| 需求 | 實作方向 |
|---|---|
| 傳輸進度顯示 | 繼承 TStream 建立進度回報流,覆寫 Read/Write |
| 多檔案/資料夾傳輸 | 客戶端打包為 ZIP/資料流序列化,伺服端解包 |
| 斷點續傳 | 協議層加入檔案位移、分塊驗證邏輯 |
| 加密傳輸 | 使用 TIdSSLIOHandlerSocketOpenSSL 或自訂加密流 |
| 防火牆穿透 | UPnP 端口映射或中繼伺服器轉發 |
fmCreate/fmOpenRead 模式正確,避免文字/二進制模式混淆CopyFrom 內部分塊處理,不會一次載入全檔NMStrmServ/NMStrm 為 C++Builder 快速建立檔案傳輸功能的利器,適合內網工具、資料同步、日誌收集等輕量級場景。搭配 TFileStream 幾行程式碼即可完成核心邏輯,開發效率極高。