C++Builder創(chuàng)建基于Internet點對點Chat

字號:

創(chuàng)建基于Internet的應用程序,你也許會想到復雜的WinSock編程。不過,C++ Builder3提供了新的WebBroker的Internet套件,其中的TClientSocket和TServerSocket組件封裝了Windows的有關API,大大簡化了WinSock編程。要通過Internet傳輸數據,至少需要一對Socket,一個Socket在客戶端,另一個Socket在服務器端。其實TClientSocket、TServerSocket組件并不是Socket對象,其屬性Socket將返回各自的Socket對象。TClientSocket用來處理客戶端到服務器端之間的socket連接,TServerSocket用來處理由客戶端發(fā)來的socket連接,一旦客戶端和服務器端都接通了socket,客戶端和服務器端就可以相互通信了。
    建立一新項目,創(chuàng)建應用程序的用戶界面:
    1.將組件頁切換到Internet頁,放一個TServerSocket組件和一個TClientSocket組件到窗體上,這樣應用程序既可以是TCP/IP服務器,也可以是TCP/IP客戶。將Port屬性都設為同一個值(如1000),確定Socket之間的連接類型為NonBlocking(非阻塞方式)。
    2.放兩個TMemo組件到窗體上,用來分別顯示雙方的談話內容,將Memo2的ReadOnly屬性設為True。
    3.在窗體的頂部放上一個Panel組件,在其上放三個按鈕:監(jiān)聽(btnlisten)、連接(btnconnect)、斷開(btndisconnect),用來啟動相應的操作。
    4.在窗體底部放一個StatusBar組件,將其SimplePanel屬性設為True,在相應的事件處理程序中改變狀態(tài)條信息,讓用戶隨時了解連接狀態(tài)。
    打開頭文件,在窗體類的Private段添加兩個私有成員: bool IsServer;String Server。雙方通信時需同時運行Chat程序,IsServer用來確定哪個Chat程序處于服務器端,Server用來存放服務器的主機名。建立窗體類的構造器如下:
    fastcall TForm1::TForm1(TComponent* Owner)
     : TForm(Owner)
    {
     IsServer=false;
     Server="localhost";
    }
    這里Server被缺省設為localhost,這樣程序可以在沒有連入Internet的單機上進行調試。在Windows子目錄下你可以找到hosts.sam文件中,在該文件中已經將本機IP地址127.0.0.1定義了主機名:
    localhost。
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
     btndisconnect- >Enabled=false;
    }
    程序運行后,如果用戶按下"監(jiān)聽"鈕,則將該程序設為服務器端,這時應將TServerSocket的Active屬性設為True,使服務器自動進入監(jiān)聽狀態(tài)。
    void __fastcall TForm1::btnlistenClick(TObject *Sender)
    {
     ClientSocket1- >Active=false;
     ServerSocket1- >Active=true;
     StatusBar1- >SimpleText="正在監(jiān)聽...";
     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;
     }
     }
    }
    當用戶提出連接請求后,客戶端會觸發(fā)OnCreate事件,程序先在狀態(tài)條中顯示連接信息,然后將顯示對方談話內容的Memo2清空,準備開始交談。
    void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
     TCustomWinSocket *Socket)
    {
     StatusBar1- >SimpleText="連接到:"+Server;
     Memo2- >Lines- >Clear();
    }