首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++Builder NMStrmServ/NMStrm 組件實現局域網檔案傳輸完整教學

     編輯:VC 教學

為什麼選 NMStrm 組件?

相比 NMFTP(需 FTP 伺服器、配置複雜),NMStrmServ (接收端) + NMStrm (發送端) 直接基於 TCP 串流,零配置、點對點、適合內網快速檔案交換。

接收端程式實現

  1. 新建 VCL 專案,放置 TNMStrmServ (命名 NMStrmServ1) 與 TSaveDialog (SaveDialog1)
  2. 設定 NMStrmServ1 的 OnMsg 事件:
void __fastcall TForm1::NMStrmServ1Msg(TObject *Sender, TMemoryStream* Strm) {
    if (!SaveDialog1->Execute()) return;              // 使用者取消

    if (FileExists(SaveDialog1->FileName))
        DeleteFile(SaveDialog1->FileName);            // 覆蓋前刪除

    std::unique_ptr fs(new TFileStream(SaveDialog1->FileName, fmCreate));
    try {
        fs->CopyFrom(Strm, Strm->Size);               // 核心:串流複製
        ShowMessage("接收成功!儲存為 " + SaveDialog1->FileName);
    } catch (...) {
        ShowMessage("接收失敗!");
    }
    // unique_ptr 自動釋放 fs
}

發送端程式實現

  1. 新建專案,放置 TNMStrm (NMStrm1)、TOpenDialog、TButton、TEdit (IP)、TLabel
  2. 設定 Button1 (Caption="發送檔案") OnClick:
void __fastcall TForm1::Button1Click(TObject *Sender) {
    if (!OpenDialog1->Execute()) return;

    std::unique_ptr fs(new TFileStream(OpenDialog1->FileName, fmOpenRead));
    try {
        NMStrm1->Host = Edit1->Text;                  // 目標 IP/主機名
        NMStrm1->FromName = "MyApp";                  // 發送者識別
        NMStrm1->PostIt(fs.get());                    // 發送串流
        ShowMessage("檔案 " + OpenDialog1->FileName + " 發送成功!");
    } catch (...) {
        ShowMessage("發送失敗:" + OpenDialog1->FileName);
    }
}

關鍵屬性與方法詳解

組件屬性/方法說明
TNMStrmServOnMsg接收到串流觸發,參數為 TMemoryStream*
TNMStrmHost接收端 IP 或主機名(預設 127.0.0.1 本機測試)
FromName發送者名稱,顯示於接收端
PostIt(TStream*)同步發送串流,阻塞直到完成或逾時
TFileStreamfmCreate/fmOpenRead建立新檔 / 唯讀開啟現有檔
CopyFrom(Source, Count)高效串流複製,內部使用 64KB 緩衝區

測試步驟

  1. 編譯兩專案生成 Receiver.exe、Sender.exe
  2. 同一台電腦雙開:先跑 Receiver,再跑 Sender 點「發送檔案」選圖片
  3. Receiver 彈出儲存對話框,確認後檔案完整接收
  4. 跨機器測試:Receiver 跑在 192.168.1.50,Sender 的 Edit 填 192.168.1.50

常見問題與解決

  • 防火牆攔截:需開放 TCP 通訊埠(預設 3000 可用 Port 屬性修改)
  • 大檔案記憶體壓力:TMemoryStream 全載入記憶體,>100MB 建議改用 TFileStream 直接配合 TIdTCPServer/Client (Indy) 分塊傳輸
  • 中文檔名亂碼:確保雙端編碼一致,或傳輸前 Base64 編碼檔名
  • 非同步需求:NMStrm 為同步阻塞,UI 會卡死;長傳輸請放入執行緒或改用 Indy 非同步組件

現代替代方案

  • Indy (TIdTCPServer/Client):功能完整、非同步、支援 SSL、標準化
  • REST/HTTP + multipart/form-data:跨平台、穿透防火牆、易除錯
  • gRPC / Protobuf:高效能、強型別契約、雲原生首選

總結

NMStrmServ/NMStrm 是 C++Builder 內建的輕量級檔案傳輸組合,**適合中小檔案、內網、快速原型**。掌握 TFileStream + CopyFrom 串流複製模式,可無縫遷移至更強大的網路庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved