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

C++Builder 實作 TCP 圖片傳輸:基於 NMSTrm 元件的點對點檔案傳送器

     編輯:關於C++

專案需求

利用 C++Builder 5.0 內建的 NMSTrm / NMSTrmServ 元件,打造一個「雙向皆可作 Client/Server」的圖片傳輸小工具。雙方啟動程式即可互傳 BMP/JPG 等圖檔,單機雙開亦可測試。

元件認識

元件角色關鍵特性
NMSTrm Client 端資料流發送器 TCP 連線、發送 TStream、事件驅動
NMSTrmServ Server 端資料流接收器 監聽 TCP 埠、接收 TStream、自動存檔
OpenPictureDialog 圖片選取對話框 支援 BMP/JPG/WMF/EMF/ICO

表單佈局與屬性設定

元件名稱類別關鍵屬性
Form1TFormCaption = "發送圖像"
Image1TImage顯示接收圖片
Button1TButtonCaption = "發送", OnClick → 發送邏輯
Button2TButtonCaption = "顯示", OnClick → 載入 tmp.bmp
Button3TButtonCaption = "打開", OnClick → OpenPictureDialog
Label1TLabelCaption = "遠程主機:"
Edit1TEdit輸入對方 IP/主機名
Edit2TEdit顯示選取檔案路徑
NMSTrm1TNMStrmClient 發送元件
NMSTrmServ1TNMStrmServServer 接收元件
OpenPictureDialog1TOpenPictureDialog圖片選取器
StatusBar1TStatusBar顯示連線/傳輸狀態

核心事件處理代碼

1. 選取圖片 → 顯示路徑

void __fastcall TForm1::Button3Click(TObject *Sender) {
    if (OpenPictureDialog1->Execute())
        Edit2->Text = OpenPictureDialog1->FileName;
}

2. 發送圖片(Client 角色)

void __fastcall TForm1::Button1Click(TObject *Sender) {
    TFileStream *fs = new TFileStream(OpenPictureDialog1->FileName, fmOpenRead);
    try {
        NMSTrm1->Host = Edit1->Text;      // 目標主機
        NMSTrm1->PostIt(fs);              // 非同步發送 Stream
    } catch (...) {
        delete fs;                        // 異常時手動釋放
    }
}

3. 接收圖片(Server 角色)

void __fastcall TForm1::NMSTrmServ1MSG(TComponent *Sender,
    const AnsiString sFrom, TStream *strm) {
    // 覆寫暫存檔
    if (FileExists(".\\tmp.bmp")) DeleteFile(".\\tmp.bmp");
    TFileStream *fs = new TFileStream(".\\tmp.bmp", fmCreate);
    try {
        fs->CopyFrom(strm, strm->Size);   // 全部寫入
    } catch (...) { }
    delete fs;
}

4. 狀態回饋事件(節錄)

void __fastcall TForm1::NMSTrm1Connect(TObject *Sender) {
    StatusBar1->SimpleText = "Connected";
}
void __fastcall TForm1::NMSTrm1PacketSent(TObject *Sender) {
    StatusBar1->SimpleText = IntToStr(NMSTrm1->BytesRecvd) + " bytes of " +
                             NMSTrm1->BytesTotal + " sent";
}
void __fastcall TForm1::NMSTrm1ConnectionFailed(TObject *Sender) {
    ShowMessage("無法連線到對方");
}

執行與測試

  1. 編譯專案產生 Project1.exe
  2. 兩台電腦(或同機雙開)各執行一份
  3. 雙方皆輸入對方 IP,點選「打開」選圖 → 「發送」
  4. 接收方自動存為 .\\tmp.bmp,點「顯示」即可預覽

已知限制與改進方向

  • 僅支援單檔傳輸:無斷點續傳、無多檔佇列。
  • 無加密/壓縮:局域網尚可,公網建議加 TLS 或 SSH Tunnel。
  • NMSTrm 元件較舊:新專案建議改用 Indy (TIdTCPClient/Server) 或 Boost.Asio,功能更豐富、維護性更高。
  • 檔案格式固定為 BMP:接收端硬編碼 .\\tmp.bmp,實際應依副檔名/MIME 動態決定。

結語

NMSTrm 系列元件雖屬經典,但以「資料流即介面」的設計思想,讓 TCP 檔案傳輸變得極其直觀。理解其事件驅動模型後,遷移至現代網路庫將毫無壓力。快動手試試,體驗「代碼極少、功能即現」的快感吧!

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