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

C++ Builder 建立 P2P 網路聊天程式

     編輯:關於C++

C++ Builder 3 引入的 TClientSocket 與 TServerSocket 元件封裝了 WinSock API,讓開發者無需處理複雜的 Socket 程式設計即可快速建立 TCP/IP 網路應用。本文完整示範一個雙向聊天程式,同一執行檔可切換為伺服器或客戶端,支援非阻塞模式、狀態列提示與錯誤處理。

介面設計

  • Internet 頁籤:拖放 TServerSocket、TClientSocket,Port = 1000,ClientType = ctNonBlocking。
  • Standard 頁籤:Memo1(輸入訊息)、Memo2(顯示對話,ReadOnly = true)。
  • Panel (Top):BtnListen(監聽)、BtnConnect(連線)、BtnDisconnect(斷線)。
  • StatusBar (Bottom):SimplePanel = true,顯示連線狀態。

核心變數宣告

private:
    bool IsServer;   // 目前是否為伺服器端
    String Server;   // 伺服器主機名稱

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    IsServer = false;
    Server = "localhost"; // 單機測試用
}

事件處理程式

表單建立

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    BtnDisconnect->Enabled = false;
}

監聽按鈕(啟動伺服器)

void __fastcall TForm1::BtnListenClick(TObject *Sender)
{
    ClientSocket1->Active = false;
    ServerSocket1->Active = true;
    StatusBar1->SimpleText = "正在監聽...";
    BtnListen->Enabled = false;
    BtnConnect->Enabled = false;
}

連線按鈕(啟動客戶端)

void __fastcall TForm1::BtnConnectClick(TObject *Sender)
{
    if (InputQuery("連線到伺服器", "輸入伺服器位址:", Server))
    {
        if (Server.Length() > 0)
        {
            ClientSocket1->Host = Server;
            ClientSocket1->Active = true;
            BtnListen->Enabled = false;
            BtnConnect->Enabled = false;
            BtnDisconnect->Enabled = true;
        }
    }
}

客戶端連線成功

void __fastcall TForm1::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket)
{
    StatusBar1->SimpleText = "已連線至:" + Server;
    Memo2->Lines->Clear();
}

伺服器接受連線

void __fastcall TForm1::ServerSocket1Accept(TObject *Sender, TCustomWinSocket *Socket)
{
    Memo2->Lines->Clear();
    IsServer = true;
    StatusBar1->SimpleText = "已連線至:" + Socket->RemoteAddress;
}

發送訊息(Enter 鍵)

void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
    if (Key == VK_RETURN)
    {
        AnsiString msg = Memo1->Lines->Strings[Memo1->Lines->Count - 1];
        if (IsServer)
            ServerSocket1->Socket->Connections[0]->SendText(msg);
        else
            ClientSocket1->Socket->SendText(msg);
    }
}

接收訊息

// 客戶端 OnRead
void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
    Memo2->Lines->Add(Socket->ReceiveText());
}

// 伺服器 OnClientRead
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket)
{
    Memo2->Lines->Add(Socket->ReceiveText());
}

斷線處理

void __fastcall TForm1::BtnDisconnectClick(TObject *Sender)
{
    ClientSocket1->Close();
}

void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket)
{
    StatusBar1->SimpleText = "正在監聽...";
}

void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket)
{
    BtnListen->Enabled = true;
    BtnConnect->Enabled = true;
    BtnDisconnect->Enabled = false;
    StatusBar1->SimpleText = "";
}

客戶端錯誤處理

void __fastcall TForm1::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket,
                                           TErrorEvent ErrorEvent, int &ErrorCode)
{
    StatusBar1->SimpleText = "無法連線至:" + Socket->RemoteHost;
    ErrorCode = 0; // 防止預設錯誤對話框
}

關鍵技術點

  1. 非阻塞模式:UI 不會因網路操作凍結,透過事件驅動收發資料。
  2. 雙角色單一執行檔:IsServer 旗標區分收發邏輯,部署極簡單。
  3. localhost 測試:127.0.0.1 對應 hosts 檔,無需外部網路即可除錯。
  4. 多連線擴充:伺服器端 Connections[] 陣列支援多客戶端,迴圈廣播即可實現群聊。

此範例展示了 C++ Builder 快速建立網路應用的能力,為後續開發即時通訊、遠端監控等系統奠定基礎。

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