📄 20001205002.htm
字号:
<HTML>
<HEAD>
<TITLE>如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序 </TITLE>
<META content="MSHTML 5.00.2314.1000" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table width="744" border="0" cellspacing="0" cellpadding="0" height="76">
<tr>
<td>
<p align="center"><span class=name00><font size="3"><b><br>
如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序</b></font><br>
</span><span class=Name01><font
color=#666666>(作者:孙航东)</font></span></p>
<p><br>
<br>
<span
class=content><br>
网络是一个激动人心的领域,编写网络上的应用程序更是很多程序员向往的情节,然而编写网络程序需要掌握大量的网络传输协议、编程接口和WinSock32
API 函数,正因为如此,要完成从Windows程序员到Web程序员的转变不是一件易事.最近笔者成功的用C++ Buil--der 5.0
Enterprise 版编写出了网上聊天程序,特介绍如下: <br>
<br>
一、 原理:网络聊天工具需要通过TCP/IP协议,因此可以把网络聊天程序分为服务器端和客户器端两部分,其中 服务器端用以把程序转换成一个虚拟的
TCP/IP 服务器. 并且和指定的客户机建立连接,在连接成功后,向指定的客户器发送和接收数据;客户器端把程序转换成一个虚拟的TCP/IP
客户器,并且向指定的服务器发出连接信号,在连接成功后,向指定的服务器发送和接收数据。在C++ Builder 5.0 环境下服务器端和客户器端的功能分别由TServerSocket控件和TClientSocket
控件加以实现。其中TCP/IP协议以包含在控件的属性中,因此只要正确填入属性,便可实现网上通讯。 <br>
<br>
二、具体实现:首先`在C++ builder 5.0 环境下建立一个Application ,并保存为Project1。在Form1
上添加如下控件,并设置相关属性,其中Memo2于显示对方传来的信息,其中Memo1用于显示传给对方的信息: <br>
<br>
控件名称 属性 值 <br>
<br>
TBevel Caption Bevel1 <br>
<br>
TSpeedButton Caption SpeedButton1 <br>
<br>
TMemo Caption Memo1 <br>
<br>
TMemo Caption Memo2 <br>
<br>
TMainMenu Caption MainMenu1 <br>
<br>
TServerSocket Caption ServerSocket1 <br>
<br>
TClientSocket Caption ClientSocket1 <br>
<br>
同时在 MainMenu1控件中增加 三个菜单项,其属性为 <br>
<br>
Name Caption <br>
<br>
Connect 连接 <br>
<br>
Disconncet 断开 <br>
<br>
Listin 监听 <br>
<br>
在Unit1 的Private中添加: <br>
<br>
bool IsServer; <br>
<br>
String Server; <br>
<br>
在Connect 的Click句柄添加如下代码: <br>
<br>
void __fastcall TForm1::ConnectClick(TObject *Sender) <br>
<br>
{ <br>
<br>
if (ClientSocket1->Active){ ClientSocke1t->Active = false;} //
判断是否以连接,如连接则断开连接// <br>
<br>
if (InputQuery("Computer to connect to", "添入要连接的机器的IP地址:", Server))
<br>
<br>
{ <br>
<br>
if (Server1.Length() > 0)//判断用户是否已经添入// <br>
<br>
{ <br>
<br>
ClientSocket-1>Host = Server;//设置要连接的IP地址为用户指定的IP地址值// <br>
<br>
ClientSocket1->Active = true;//进行连接// <br>
<br>
} <br>
<br>
} <br>
<br>
} <br>
<br>
在Listen的Click句柄添加如下代码: <br>
<br>
void __fastcall Form1 ::ListenClick(TObject *Sender) <br>
<br>
{ <br>
<br>
Listen->Checked = !Listen->Checked; <br>
<br>
if (Listen->Checked) <br>
<br>
ServerSocket1->Active = true;//服务器端监听来自客户器断的信号// <br>
<br>
else <br>
<br>
ServerSocket1->Active = false; <br>
<br>
<br>
<br>
} <br>
<br>
在Disconnect 的Click句柄添加如下代码: <br>
<br>
void __fastcall TForm1::ExitClick(TObject *Sender) <br>
<br>
{ <br>
<br>
ServerSocket1->Close();//关闭服务器端// <br>
<br>
ClientSocket1->Close();//关闭客户器端// <br>
<br>
Close(); <br>
<br>
} <br>
<br>
在Memo1 的KeyDown句柄添加如下代码: <br>
<br>
void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
<br>
<br>
TShiftState Shift) <br>
<br>
{ <br>
<br>
if (Key == VK_RETURN) <br>
<br>
{ <br>
<br>
if (IsServer) <br>
<br>
{ServerSocket->Socket->Connections[0]->SendText( <br>
<br>
Memo1->Lines->Strings[Memo1->Lines->Count - 1]); }//作为服务器一端发送数据//
<br>
<br>
else <br>
<br>
{ ClientSocket->Socket->SendText(Memo1->Lines->Strings[
<br>
<br>
Memo1->Lines->Count -1]);}//作为客户器一端发送数据// <br>
<br>
} <br>
<br>
} <br>
<br>
在ClientSocket1的Connect句柄添加如下代码: <br>
<br>
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender , TCustomWinSocke
<br>
<br>
t *Socket) <br>
<br>
{//当用户和远程服务器连接成功后,激发该事件// <br>
<br>
StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteHost;
<br>
<br>
} <br>
<br>
在ClientSocket1的Error句柄添加如下代码: <br>
<br>
void __fastcall TForm1::ClientSocket1Error(TObject *Sender, <br>
<br>
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
<br>
<br>
{ //当用户和远程服务器连接失败后,激发该事件// <br>
<br>
Memo2->Lines->Add("Error connecting to:" + Server); <br>
<br>
ErrorCode = 0; <br>
<br>
} <br>
<br>
在ClientSocket1的Read句柄添加如下代码: <br>
<br>
void __fastcall TChatForm::ClientSocket1SeverRead(TObject *Sender, TCustomWinSo
<br>
<br>
cket *Socket) <br>
<br>
{ <br>
<br>
//当作为客户器一端读来自服务器一端的数据时,激发该事件// <br>
<br>
Memo2->Lines->Add(Socket->ReceiveText()); <br>
<br>
} <br>
<br>
在SeverSocket1的ClientRead句柄添加如下代码 <br>
<br>
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocke
<br>
<br>
t *Socket) <br>
<br>
{ <br>
<br>
//当作为客户器一端读来自服务器一端的数据时,激发该事件// <br>
<br>
Memo2->Lines->Add(Socket->ReceiveText()); <br>
<br>
} <br>
<br>
在SeverSocket1的Accept句柄添加如下代码 <br>
<br>
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender, TCustomWinSocket
<br>
<br>
*Socket) <br>
<br>
{ //当服务器成功的监听到来自客户器的信号后,激发该事件// <br>
<br>
IsServer = true; <br>
<br>
StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteAddress;
<br>
<br>
<br>
<br>
} <br>
<br>
在Form1的Create句柄添加如下代码: <br>
<br>
void __fastcall TForm1::Form1Create(TObject *Sender) <br>
<br>
{ <br>
<br>
IsServer=false; <br>
<br>
} <br>
<br>
注:“//”为注释. <br>
<br>
以上程序C++ Builder 5.0Enterprise通过。</span></p>
</td>
</tr>
</table>
</div>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -