如何利用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通过。 摘自《赛迪网》 孙航东/文
|
|
转载请注明原文地址: https://ibbs.8miu.com/read-1875.html