如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序

    技术2022-05-11  109

    如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序
     网络是一个激动人心的领域,编写网络上的应用程序更是很多程序员向往的情节,然而编写网络程序需要掌握大量的网络传输协议、编程接口和WinSock32 API 函数,正因为如此,要完成从Windows程序员到Web程序员的转变不是一件易事.最近笔者成功的用C++ Buil--der 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       Bevel1TSpeedButton     Caption       SpeedButton1TMemo         Caption       Memo1TMemo         Caption       Memo2TMainMenu       Caption       MainMenu1TServerSocket     Caption       ServerSocket1TClientSocket     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 , TCustomWinSocket *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通过。  摘自《赛迪网》 孙航东/文

    最新回复(0)