程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 利用CB創建用戶自己的網上聊天程序

利用CB創建用戶自己的網上聊天程序

編輯:關於C++

網絡是一個激動人心的領域,編寫網絡上的應用程序更是很多程序員向往的情節,然而編寫網絡程序需要掌握大量的網絡傳輸協議、編程接口和WinSock32 API 函數,正因為如此,要完成從Windows程序員到Web程序員的轉變不是一件易事.最近筆者成功的用C++ Builder 5.0 Enterprise 版編寫出了網上聊天程序,特介紹如下:

一、原理:網絡聊天工具需要通過TCP/IP協議,因此可以把網絡聊天程序分為服務器端和客戶器端兩部分,其中 服務器端用以把程序轉換成一個虛擬的 TCP/IP 服務器. 並且和指定的客戶機建立連接,在連接成功後,向指定的客戶器發送和接收數據;客戶器端把程序轉換成一個虛擬的TCP/IP 客戶器,並且向指定的服務器發出連接信號,在連接成功後,向指定的服務器發送和接收數據。在C++ Builder 5.0 環境下服務器端和客戶器端的功能分別由TServerSocket控件和TClientSocket 控件加以實現。其中TCP/IP協議以包含在控件的屬性中,因此只要正確填入屬性,便可實現網上通訊。

二、具體實現:首先`在C++ builder 5.0 環境下建立一個Application ,並保存為Project1。在Form1 上添加如下控件,並設置相關屬性,其中Memo2於顯示對方傳來的信息,其中Memo1用於顯示傳給對方的信息:

控件名稱         屬性         值

Tbevel         Caption       Bevel1

TSpeedButton     Caption       SpeedButton1

Tmemo         Caption       Memo1

Tmemo         Caption       Memo2

TMainMenu       Caption       MainMenu1

TServerSocket     Caption       ServerSocket1

TClientSocket     Caption      ClientSocket1

同時在 MainMenu1控件中增加 三個菜單項,其屬性為

Name                 Caption  

Connect               連接

Disconncet              斷開

Listin                監聽

在Unit1 的Private中添加:

bool   IsServer;

String  Server;

在Connect 的Click句柄添加如下代碼:

void __fastcall TForm1::ConnectClick(Tobject *Sender)
{
if (ClientSocket1->Active){ ClientSocke1t->Active = false;} // 判斷是否以連接,如連接則斷開連接//
if (InputQuery("Computer to connect to", "添入要連接的機器的IP地址:", Server))
{
   if (Server1.Length() > 0)//判斷用戶是否已經添入//
   {
     ClientSocket-1>Host = Server;//設置要連接的IP地址為用戶指定的IP地址值//
     ClientSocket1->Active = true;//進行連接//
   }
}
}

在Listen的Click句柄添加如下代碼:

void __fastcall Form1 ::ListenClick(Tobject *Sender)
{
Listen->Checked = !Listen->Checked;
if (Listen->Checked)
   ServerSocket1->Active = true;//服務器端監聽來自客戶器斷的信號//
else
   ServerSocket1->Active = false;
}

在Disconnect 的Click句柄添加如下代碼:

void __fastcall TForm1::ExitClick(Tobject *Sender)
{
ServerSocket1->Close();//關閉服務器端//
ClientSocket1->Close();//關閉客戶器端//
Close();
}

在Memo1 的KeyDown句柄添加如下代碼:

void __fastcall TForm1::Memo1KeyDown(Tobject *Sender, WORD &Key,
   TShiftState Shift)
{
if (Key == VK_RETURN)
{
   if (IsServer)
     {ServerSocket->Socket->Connections[0]->SendText(
     Memo1->Lines->Strings[Memo1->Lines->Count - 1]); }//作為服務器一端發送數據//
   else
   { ClientSocket->Socket->SendText(Memo1->Lines->Strings[
     Memo1->Lines->Count -1]);}//作為客戶器一端發送數據//
}
}

在ClientSocket1的Connect句柄添加如下代碼:

void __fastcall TForm1::ClientSocket1Connect(Tobject *Sender , TCustomWinSocke
t *Socket)
{//當用戶和遠程服務器連接成功後,激發該事件//
StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteHost;
}

在ClientSocket1的Error句柄添加如下代碼:

void __fastcall TForm1::ClientSocket1Error(Tobject *Sender,TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{ //當用戶和遠程服務器連接失敗後,激發該事件//
Memo2->Lines->Add("Error connecting to:" + Server);
ErrorCode = 0;
}

在ClientSocket1的Read句柄添加如下代碼:

void __fastcall TChatForm::ClientSocket1SeverRead(Tobject *Sender, TCustomWinSocket *Socket)
{
//當作為客戶器一端讀來自服務器一端的數據時,激發該事件//
Memo2->Lines->Add(Socket->ReceiveText());
}

在SeverSocket1的ClientRead句柄添加如下代碼

void __fastcall TForm1::ServerSocket1ClientRead(Tobject *Sender, TCustomWinSocket *Socket)
{
//當作為客戶器一端讀來自服務器一端的數據時,激發該事件//
Memo2->Lines->Add(Socket->ReceiveText());
}

在SeverSocket1的Accept句柄添加如下代碼

void __fastcall TForm1::ServerSocket1Accept(Tobject *Sender, TCustomWinSocket
*Socket)
{ //當服務器成功的監聽到來自客戶器的信號後,激發該事件//
IsServer = true;
StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteAddress;
}

在Form1的Create句柄添加如下代碼:

void __fastcall TForm1::Form1Create(Tobject *Sender)
{
   IsServer=false;
}

注:“//”為注釋.

以上程序C++ Builder 5.0Enterprise通過。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved