当前位置:天才代写 > tutorial > C语言/C++ 教程 > TServerSocket和TClientSocket的利用

TServerSocket和TClientSocket的利用

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:798

副标题#e#

在网络编程中,WinSocket API编程是最根基,也是最贫苦的处所(说句不怕影响形象的话,我对此就是一知半解)。可是,假如你是利用C++Builder作为编程平台,你就偷着乐吧,有了BCB,菜鸟变好手!:-)

在BCB中,TServerSocket和TClientSocket涵盖了根基的WinSocket编程,个中TServerSocket作为处事器方利用,TClientSocket作为客户端利用,这两个组件自己并不提供Socket毗连,可是他们都有一个Socket属性,这个属性才提供了Socket毗连。下面就先向各人先容一下这两个组件常用的要领属性,然后在通过一个例子来看看这两个组件的利用。

1)TServerSocket

名称     范例       说明

Socket   TServerWinSocket 最重要的属性,提供Socket毗连,事实上发送/吸收数据都要靠这个属性.

Port    int       要监听的端口,假如在Service属性中指定了处事范例,此属性将被忽略.

Service  AnsiString    提供的处事,如HTTP、FTP等,假如在这里指定了处事范例,

Port将被忽略,因为各类处事都有特定的端口,如FTP:21、HTTP:80

ServerType TServerType   配置与客户毗连的方法,取值为两个列举常量stNonBlocking和

stThreadBlocking,stNonBlocking暗示用非阻塞方法毗连每一个客户

每个毗连都在一个单独的线程中处理惩罚。并用OnClientRead()和

OnClientWrite()通知处事器端的Socker举办读写。stThreadBlocking

暗示以阻塞方法毗连客户,即以主动查询的方法可客户毗连。

Active   bool       激活处事,相当于挪用Open()要领。

OnAccept事件当有客户请求毗连时触发

OnClientRead事件通知处事器去读取有关信息。OnClientWrite与此雷同。

2)TClientSocket

名称    范例        说明

Socket   TClientWinSocket 同TServerSocket

Active   bool       同TServerSocket

Address   AnsiString    处事器的IP地点,如202.98.35.14

ClientType TClientType    与处事器毗连方法,取值为两个列举常量ctNonBlocking,tBlocking。

ctNonBlocking暗示非阻塞方法,ctBlocking暗示阻塞方法,详见上例。

Host    AnsiString    要毗连的主机名,如www.cpcw.com

Port    int        同TServerSocket

Service   AnsiString    同TServerSocket


#p#副标题#e#

OnConnect事件当毗连时产生,OnConnecting、OnDisConnect与此雷同

OnRead事件通知客户机去读取有关信息。OnWrite与此雷同。

TServerSocket和TClientSocket只提供根基的处事器/客户机的毗连,真正提供数据传输的是它们都有的属性Socket,它的范例别离是TServerWinSocket和TClientWinSocket,而TServerWinSocket和TClientWinSocket的父类都是TCustomWinSocket,下面我们就来看看TServerWinSocket和TClientWinSocket常用的属性和要领。

配合的属性要领(来历于TCustomWinSocket)

名称     范例     说明

Connected   bool     查抄是否毗连乐成

LocalAddress  AnsiString  当地IP地点,与此雷同LocalHost:本机域名,LocalPort:本机端口

RemoteAddress AnsiString  另一端的IP地点,与此雷同RemoteHost:另一端域名,

RemotePort:另一端端口

SocketHandle  int     只读,返回Socket工具的Windows句柄,挪用WinSocket API函数会用到它。

Handle     HWND     Socket可以或许接管到的异步事件都是以Windows动静的形式发送给此句柄的。

Close()要领作为处事器,封锁所有毗连;作为客户机,封锁本身与处事器的毗连

SendText(AnsiString)要领发送一个字符串,

SendBuf(void* buff,int count)发送缓冲区buff中的count个字节,返回实际发送的字节数

SendStream(TStream* AStream)发送一个流到Socket中。

ReceiveText()从Socket中读取并返回一个字符串。

ReceiveLength()从Socket读取数据需几多字节的缓冲区。

ReceiveBuf(void* buff,int count)从Socket中读取count字节的数据到buff。

TClientWinSocket

TClientWinSocket只增加了一个ClientType属性,

用于抉择与处事器的毗连范例(拜见TClientSocket->ClientType)。

TServerWinSocket

名称       范例说明

ServerType    处事范例,拜见TServerSocket->ServerType。

ActiveConnection int只读,返回当前勾当的毗连数。

Connection    TCustomWinSocket数组,索引n暗示第n+1个毗连,如Connection[0]暗示第一个毗连。

有了这些常识,我们就可以完成一些根基的WinSocket编程了,下面就团结一个简朴的闲聊措施来看看详细的应用。

首先在窗体上安排以下VCL组件,并修改相应属性:

范例       Name     属性    Caption/Text    说明

TCheckBox   ckListen  监听当选取时,本措施作为处事器

TCheckBox   ckConnect  毗连当选取时,本措施作为客户机

TEdit     edName   无名氏闲聊时所用的名字。

TBitBtn    bbtSave&S  生存单击时生存谈话内容

TBitBtn    bbtClose&C 封锁单击时封锁此窗口(配置Kind=bkClose)

TEdit     edTalk   在此输入谈话内容

TMemo     mmTalk   在此显示谈话内容

TServerSocket ServerSocket1 作处事器时利用(配置Port=2222)

TClientSocket ClientSocket1 作为客户时利用(配置Port=2222)

TSaveDialog  sdTalk     生存文件时的选项(配置DefaultExt="*.txt",Filter=文本文件(*.TXT)

|*.txt|所有文件(*.*)|*.*)。

TStatusBar   StatusBar1   用于显示一些提示信息,只要在属性"Pannels"中加一栏即可

#p#副标题#e#

措施作为处事器的配置:

#p#分页标题#e#

当单击"监听"时,假如没有监听则开始监听,在提示栏中显示"监听",并把"毗连"这个复选框无效。假如已经监听,则打消监听,并使"毗连"这个复选框有效。所以,在ckListen的OnClick事件中插手以下代码:

if(ServerSocket1->Active)
{
ServerSocket1->Active=false;
ckListen->Checked=false;
StatusBar1->Panels->Items[0]->Text="";
}
else
{
ServerSocket1->Active=true;
ckListen->Checked=true;
ClientSocket1->Active=false;
StatusBar1->Panels->Items[0]->Text="监听..." ;
}
ckConnect->Enabled=!(ckListen->Checked);

当有客户插手时,向所有的客户发出通知:并在自已的mmTalk插手此动静:所以在ServerSocket1的OnAccept事件中插手如下代码:

int i;
AnsiString str1="处事器动静:"+Socket->RemoteHost+"插手";
for(i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
ServerSocket1->Socket->Connections[i]->SendText("处事器动静:"+Socket->RemoteHost+"插手");
StatusBar1->Panels->Items[0]->Text=str1;
mmTalk->Lines->Add(str1);

当客户机通知处事器读信息时,首先读出字符串,然后把读到的字符串发送到每一台毗连的客户,并在自已的mmTalk中插手客户发送来的字符串。所以,在TServerSocket的OnClientRead事件中插手以下代码:

AnsiString str1=Socket->ReceiveText();
mmTalk->Lines->Add(str1);
int i;
for(i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
ServerSocket1->Socket->Connections[i]->SendText(str1);

措施作为客户机的配置:

当单击"毗连"时,假如还未毗连,则询问要毗连的主机,然后毗连之,屏蔽"监听";假如已经毗连,则断开毗连。"监听"使能。所以,在ckConnect的OnClick事件中插手以下代码:

if(ClientSocket1->Active)
{
ClientSocket1->Active=false;
ckConnect->Checked =false;
}
else
{
AnsiString Server="localhost";
if(InputQuery("毗连","请输入要毗连的主机地点:",Server))
{
ClientSocket1->Host=Server;
ClientSocket1->Active=true;
ckConnect->Checked =true;
}
}

ckListen->Enabled= !(ckConnect->Checked);

当毗连处事器乐成时,在状态栏中显示此信息,所以,在ClientSocket1的ClientSocket1Connect中插手:

StatusBar1->Panels->Items[0]->Text ="毗连到主机:"+Socket->RemoteHost;

当处事器发送字符串来时,把它插手mmTalk中,但假如本字符串就是自已发送的(因为处事器会把收到的动静发给每一客户),为条信息就是反复的,所以,要较量mmTalk中最后两条信息是否沟通,假如沟通,则删除反复信息。代码如下:

mmTalk->Lines->Add(Socket->ReceiveText());
int i=mmTalk->Lines->Count-1;
if(mmTalk->Lines->Strings[i]==mmTalk->Lines->Strings[i-1])
mmTalk->Lines->Delete(i);

#p#副标题#e#

公用部门

当在edTalk输入攀谈内容,按回车键暗示输入完成,此时把攀谈内容发送出去并排除edTalk的内容。在发送信息时,要看本措施是作为处事器照旧客户机,假如是处事器则把信息发送到每一个客户;假如是作为客户则把信息发送随处事器。代码如下:

if(Key==13)
{
mmTalk->Lines->Add(edName->Text+":"+edTalk->Text);
if(ckListen->Enabled&&ckConnect->Enabled==false)
//"监听"有效,"毗连"无效。暗示是处事器
{
int i;
for(i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
ServerSocket1->Socket->Connections[i]->SendText(edName->Text+":"+edTalk->Text);
}
else
{
ClientSocket1->Socket->SendText(edName->Text+":"+edTalk->Text);
}
edTalk->Text="";
}

mmTalk的内容不行能永远增加,所以当它有100行时就清空它,在mmTalk的OnChange事件中查抄:

if(mmTalk->Lines->Count>=100)mmTalk->Lines->Clear();

虽然你也可以双击mmTalk来清空它,在mmTalk的OnDblClick事件中插手:

mmTalk->Lines->Clear();

当你以为谈话的内容很有意思,你可以单击bbtSave打开生存对话框配置生存特性,所以在bbtSave的onClick中插手代码:

if(sdTalk->Execute())

mmTalk->Lines->SaveToFile(sdTalk->FileName);

OK,我们的闲聊措施就完成了,在局域网中试试吧?假如你只有一台呆板,客户措施在毗连时处事器时输入localhost或你呆板的名字就可以了。

熟悉了这两个组件我们就可以写如联众游戏一样的网络游戏了(至少理论上如此)

 

    关键字:

天才代写-代写联系方式