12.1. 例如TCP / IP协议聊天

聊天表套接字示例TCP / IP协议
注意事项:
建立有效的通讯端口属性为ServerSocket的ClientSocket和“ - >端口,如1024。
添加一个Panel控件StatusBar1中 属性- >“面板- >”添加新。
main.cpp中
//------------------------------------------------ ---------------------------
#包括
的#pragma hdrstop
#包括“main.h”
//------------------------------------------------ ---------------------------
的#pragma链接“ScktComp”
资源的#pragma“*. DFM的”
TChatForm * ChatForm;
//------------------------------------------------ ---------------------------
TChatForm __fastcall::TChatForm(TComponent *业主):TForm(业主)
{
}
//------------------------------------------------ ---------------------------
/ /启用Socket服务器,并指定聆听模式
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:CheckBoxListenClick(TObject *发件人)
{
/ / CheckBoxList ->选中= CheckBoxList ->检查!;
如果(CheckBoxList ->选中){
ClientSocket ->有效=虚假的;
ServerSocket的->有效=真;
StatusBar1中->面板->产品[0] - >“文本=”听...";
否则{}
如果(ServerSocket的-> Active)的{
ServerSocket的->有效=虚假的;
}
StatusBar1中->面板->产品[0] - >“文本=”“;
}
}
//------------------------------------------------ ---------------------------
/ /连接到指定的主机
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ConnectClick(TObject *发件人)
{
/ /如果连接处于活动状态,它必须建立新之前关闭
如果(ClientSocket -> Active)的{
ClientSocket ->有效=虚假的;
}
/ /连接到服务器
如果(InputQuery(“计算机连接到”,“地址名称:”,服务器)){/ /要求服务器的IP
如果(Server.Length()“0){
ClientSocket ->“主机=服务器; / /指定主机的IP
ClientSocket ->有效=真正的,/ /连接到服务器
/ / CheckBoxList ->选中= 0; / /关闭服务器,离开聆听模式
/ /如果你停止服务器,你不能让一个连接到localhost
}
}
}
//------------------------------------------------ ---------------------------
/ /关闭并退出通信
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ExitClick(TObject *发件人)
{
ServerSocket的->“关闭(); / /关闭套接字服务器
ClientSocket ->“关闭()/ /关闭套接字客户端
关闭()/ /出口程序
}
//------------------------------------------------ ---------------------------
/ /发送数据
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:Memo1KeyDown(TObject *发件人,Word和重点,TShiftState移位)
{
如果(关键== VK_RETURN){/ /如果按下回车
/ /如果我们作为一个服务器的行为,客户端已经连接到我们
如果(IsServer){
/ /发送当前行
ServerSocket的->的Socket ->“连接[0] - >”sendtext(Memo1 ->通信线路的>“字符串[Memo1 ->线->计数 - 1]);
}
/ /如果我们作为一个客户端的行为,您连接到服务器
否则{
/ /发送当前行
ClientSocket ->的Socket -> sendtext(Memo1 ->通信线路的>“字符串[Memo1 ->线->数-1]);
}
}
}
//------------------------------------------------ ---------------------------
/ /当启动该程序
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:FormCreate(TObject *发件人)
{
CheckBoxList ->选中=真正的,/ /启用Socket和进入聆听模式
}
//------------------------------------------------ ---------------------------
/ /当连接
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ClientSocketConnect(TObject *发件人,TCustomWinSocket *座)
{
StatusBar1中->面板->产品[0] - >“文本=”连接到:“+的Socket ->远程主机;
}
//------------------------------------------------ ---------------------------
/ /停止或断开连接
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:DisconnectClick(TObject *发件人)
{
ClientSocket ->有源= 0; / /关闭连接到服务器
ServerSocket的->有效=真正的,/ /允许,进入ServerSocket的聆听模式
StatusBar1中->面板->产品[0] - >“文本=”听...";
}
//------------------------------------------------ ---------------------------
/ /客户端套接字时发生应该阅读的套接字连接。
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ClientSocketRead(TObject *发件人,TCustomWinSocket *座)
{
/ /当服务器发送数据到这个系数和进程
Memo2 ->通信线路的>“添加(插座-> ReceiveText())/ /添加数据到内存接待
}
//------------------------------------------------ ---------------------------
/ /服务器套接字时发生应改为从客户端套接字的信息。
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ServerSocketClientRead(TObject *发件人,TCustomWinSocket *座)
{
/ /当客户端发送数据到服务器,这一过程有
Memo2 ->通信线路的>“添加(插座-> ReceiveText())/ /添加数据到内存接待
}
//------------------------------------------------ ---------------------------
/ /它出现后立即接受客户端套接字连接到一个服务器上的插座。
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ServerSocketAccept(TObject *发件人,TCustomWinSocket *座)
{
IsServer =真正的,/ /作为服务器
StatusBar1中->面板->产品[0] - >“文本=”连接到:“+的Socket -> RemoteAddress;
}
//------------------------------------------------ ---------------------------
/ /当一个完整的客户端套接字连接的服务器套接字接受的发生。
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ServerSocketClientConnect(TObject *发件人,TCustomWinSocket *座)
{
Memo2 ->通信线路的>“清除(); / /清理数据备忘录
}
//------------------------------------------------ ---------------------------
/ /它发生之前关闭的客户端套接字连接到服务器。
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ClientSocketDisconnect(TObject *发件人,TCustomWinSocket *座)
{
/ / CheckBoxList ->选中=真正的,/ /启用Socket和进入聆听模式
/ /只有当它是时,作为一个客户端代理服务器的
}
//------------------------------------------------ ---------------------------
/ /当socket连接失败,使用,或关闭连接。
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ClientSocketError(TObject *发件人,TCustomWinSocket *插座,TErrorEvent ErrorEvent,诠释及错误码)
{
Memo2 ->通信线路的>“添加(”无法连接到:“+服务器);
错误码= 0;
}
//------------------------------------------------ ---------------------------
/ /时发生到客户端套接字连接已关闭。
//------------------------------------------------ ---------------------------
无效__fastcall TChatForm:ServerSocketClientDisconnect(TObject *发件人,TCustomWinSocket *座)
{
StatusBar1中->面板->产品[0] - >“文本=”听...";
}
main.h
//------------------------------------------------ ---------------------------
#IFNDEF的mainha
#定义mainha
//------------------------------------------------ ---------------------------
#包括<Classes.hpp>
#包括<Controls.hpp>
#包括<StdCtrls.hpp>
#包括<Forms.hpp>
#包括“ScktComp.hpp”
#包括<Buttons.hpp>
#包括<ComCtrls.hpp>
#包括<ExtCtrls.hpp>
#包括<Menus.hpp>
//------------------------------------------------ ---------------------------
TChatForm类:public TForm
{
__published:/ / IDE的管理组件
TStatusBar * StatusBar1中;
TPanel * Panel1的;
TMemo * Memo1;
TMemo * Memo2;
TServerSocket * ServerSocket的;
TClientSocket * ClientSocket;
TButton的*连接;
TCheckBox * CheckBoxList;
TButton的*断开;
TButton的*退出;
无效__fastcall Memo1KeyDown(TObject *发件人,Word和重点,
TShiftState转移);
无效__fastcall FormCreate(TObject *发件人);
无效__fastcall ClientSocketConnect(TObject *发件人,
TCustomWinSocket *座);
无效__fastcall ClientSocketDisconnect(TObject *发件人,
TCustomWinSocket *座);
无效__fastcall ClientSocketRead(TObject *发件人,
TCustomWinSocket *座);
无效__fastcall ServerSocketClientRead(TObject *发件人,
TCustomWinSocket *座);
无效ServerSocketAccept(TObject *发件人__fastcall,
TCustomWinSocket *座);
无效__fastcall ServerSocketClientConnect(TObject *发件人,
TCustomWinSocket *座);
无效__fastcall ClientSocketError(TObject *发件人,
TCustomWinSocket *插座,TErrorEvent ErrorEvent,诠释及错误码);
无效__fastcall ServerSocketClientDisconnect(TObject *发件人,
TCustomWinSocket *座);
无效__fastcall CheckBoxListenClick(TObject *发件人);
无效__fastcall ConnectClick(TObject *发件人);
无效__fastcall DisconnectClick(TObject *发件人);
无效__fastcall ExitClick(TObject *发件人);
私人:/ /用户声明
市民:/ /用户声明
布尔IsServer / /作为服务器的行为
服务器字符串/ / IP连接到服务器
__fastcall TChatForm(TComponent *拥有者);
};
//------------------------------------------------ ---------------------------
外部TChatForm * ChatForm;
//------------------------------------------------ ---------------------------
#Endif