C++ Builder 3 引入的 TClientSocket 與 TServerSocket 元件封裝了 WinSock API,讓開發者無需處理複雜的 Socket 程式設計即可快速建立 TCP/IP 網路應用。本文完整示範一個雙向聊天程式,同一執行檔可切換為伺服器或客戶端,支援非阻塞模式、狀態列提示與錯誤處理。
TServerSocket、TClientSocket,Port = 1000,ClientType = ctNonBlocking。Memo1(輸入訊息)、Memo2(顯示對話,ReadOnly = true)。BtnListen(監聽)、BtnConnect(連線)、BtnDisconnect(斷線)。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;
}
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; // 防止預設錯誤對話框
}
IsServer 旗標區分收發邏輯,部署極簡單。127.0.0.1 對應 hosts 檔,無需外部網路即可除錯。Connections[] 陣列支援多客戶端,迴圈廣播即可實現群聊。此範例展示了 C++ Builder 快速建立網路應用的能力,為後續開發即時通訊、遠端監控等系統奠定基礎。