📄 20000924006.htm
字号:
<HTML>
<HEAD>
<TITLE>TServerSocket和TClientSocket的使用</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><strong><font size="3"><br>
TServerSocket和TClientSocket的使用</font><br>
抱雪</strong></p>
在网络编程中,WinSocket API编程是最基本,也是最麻烦的地方(说句不怕影响形象的话,我对此就是一知半解)。但是,如果你是使用C++Builder作为编程平台,你就偷着乐吧,有了BCB,菜鸟变高手!:-)<br>
<br>
在BCB中,TServerSocket和TClientSocket涵盖了基本的WinSocket编程,其中TServerSocket作为服务器方使用,TClientSocket作为客户端使用,这两个组件本身并不提供Socket连接,但是他们都有一个Socket属性,这个属性才提供了Socket连接。下面就先向大家介绍一下这两个组件常用的方法属性,然后在通过一个例子来看看这两个组件的使用。<br>
1)TServerSocket<br>
<table
cellpadding=0 cellspacing=0 width="100%">
<tbody>
<tr>
<td width="12%">名称</td>
<td width="18%">类型</td>
<td width="70%">说明</td>
</tr>
<tr>
<td width="12%">Socket</td>
<td width="18%">TServerWinSocket</td>
<td width="70%">最重要的属性,提供Socket连接,事实上发送/接收数据都要靠这个属性,下面还有详细的介绍。</td>
</tr>
<tr>
<td height=20 width="12%">Port</td>
<td height=20 width="18%">int</td>
<td height=20 width="70%">要监听的端口,如果在Service属性中指定了服务类型,此属性将被忽略。</td>
</tr>
<tr>
<td width="12%">Service</td>
<td width="18%">AnsiString</td>
<td
width="70%">提供的服务,如HTTP、FTP等,如果在这里指定了服务类型,Port将被忽略,因为各种服务都有特定的端口,如FTP:21、HTTP:80</td>
</tr>
<tr>
<td width="12%">ServerType</td>
<td width="18%">TServerType</td>
<td width="70%">设置与客户连接的方式,取值为两个枚举常量stNonBlocking和 stThreadBlocking,stNonBlocking表示用非阻塞方式连接每一个客户,每个连接都在一个单独的线程中处理。并用OnClientRead()和OnClientWrite()通知服务器端的Socker进行读写。
stThreadBlocking表示以阻塞方式连接客户,即以主动查询的方式可客户连接。</td>
</tr>
<tr>
<td width="12%">Active</td>
<td width="18%">bool</td>
<td width="70%">激活服务,相当于调用Open()方法。</td>
</tr>
<tr>
<td width="12%">OnAccept</td>
<td width="18%">事件</td>
<td width="70%">当有客户请求连接时触发</td>
</tr>
<tr>
<td width="12%">OnClientRead</td>
<td width="18%">事件</td>
<td width="70%">通知服务器去读取有关信息。OnClientWrite与此类似。</td>
</tr>
</tbody>
</table>
<p>2)TClientSocket</p>
<table
cellpadding=0 cellspacing=0 width="100%">
<tbody>
<tr>
<td width="14%">名称</td>
<td width="17%">类型</td>
<td width="69%">说明</td>
</tr>
<tr>
<td width="14%">Socket</td>
<td width="17%">TClientWinSocket</td>
<td width="69%">同TServerSocket</td>
</tr>
<tr>
<td width="14%">Active</td>
<td width="17%">bool</td>
<td width="69%">同TServerSocket</td>
</tr>
<tr>
<td width="14%">Address</td>
<td width="17%">AnsiString</td>
<td width="69%">服务器的IP地址,如202.98.35.14</td>
</tr>
<tr>
<td width="14%">ClientType</td>
<td width="17%">TClientType</td>
<td
width="69%">与服务器连接方式,取值为两个枚举常量ctNonBlocking,tBlocking。ctNonBlocking表示非阻塞方式,ctBlocking表示阻塞方式,详见上例。</td>
</tr>
<tr>
<td width="14%">Host</td>
<td width="17%">AnsiString</td>
<td width="69%">要连接的主机名,如www.cpcw.com</td>
</tr>
<tr>
<td width="14%">Port</td>
<td width="17%">int</td>
<td width="69%">同TServerSocket</td>
</tr>
<tr>
<td width="14%">Service</td>
<td width="17%">AnsiString</td>
<td width="69%">同TServerSocket</td>
</tr>
<tr>
<td width="14%">OnConnect</td>
<td width="17%">事件</td>
<td width="69%">当连接时发生,OnConnecting、OnDisConnect与此类似</td>
</tr>
<tr>
<td width="14%">OnRead</td>
<td width="17%">事件</td>
<td width="69%">通知客户机去读取有关信息。OnWrite与此类似。</td>
</tr>
</tbody>
</table>
<p>TServerSocket和TClientSocket只提供基本的服务器/客户机的连接,真正提供数据传输的是它们都有的属性Socket,它的类型分别是TServerWinSocket和TClientWinSocket,而TServerWinSocket和TClientWinSocket的父类都是TCustomWinSocket,下面我们就来看看TServerWinSocket和TClientWinSocket常用的属性和方法。
</p>
<p>共同的属性方法(来源于TCustomWinSocket)</p>
<table border=0
cellpadding=0 cellspacing=0 width="100%">
<tbody>
<tr>
<td width="22%">名称</td>
<td width="13%">类型</td>
<td width="65%">说明</td>
</tr>
<tr>
<td width="22%">Connected</td>
<td width="13%">bool</td>
<td width="65%">检查是否连接成功</td>
</tr>
<tr>
<td width="22%">LocalAddress</td>
<td width="13%">AnsiString</td>
<td width="65%">本地IP地址,与此类似LocalHost:本机域名,LocalPort:本机端口</td>
</tr>
<tr>
<td width="22%">RemoteAddress</td>
<td width="13%">AnsiString</td>
<td width="65%">另一端的IP地址,与此类似RemoteHost:另一端域名,RemotePort:另一端端口</td>
</tr>
<tr>
<td width="22%">SocketHandle</td>
<td width="13%">int</td>
<td width="65%">只读,返回Socket对象的Windows句柄,如果你要调用WinSocket API函数,将用到此句柄。</td>
</tr>
<tr>
<td width="22%">Handle</td>
<td width="13%">HWND</td>
<td width="65%">Socket能够接受到的异步事件都是以Windows消息的形式发送给此句柄的。</td>
</tr>
<tr>
<td width="22%">Close()</td>
<td width="13%">方法</td>
<td width="65%">作为服务器,关闭所有连接;作为客户机,关闭自己与服务器的连接</td>
</tr>
<tr>
<td width="22%">SendText(AnsiString)</td>
<td width="13%">方法</td>
<td width="65%">发送一个字符串,</td>
</tr>
<tr>
<td colspan=2>SendBuf(void* buff,int count)</td>
<td width="65%">发送缓冲区buff中的count个字节,返回实际发送的字节数</td>
</tr>
<tr>
<td colspan=2>SendStream(TStream* AStream)</td>
<td width="65%">发送一个流到Socket中。</td>
</tr>
<tr>
<td colspan=2>ReceiveText()</td>
<td width="65%">从Socket中读取并返回一个字符串。</td>
</tr>
<tr>
<td colspan=2 height=18>ReceiveLength()</td>
<td height=18 width="65%">从Socket读取数据需多少字节的缓冲区。</td>
</tr>
<tr>
<td colspan=2>ReceiveBuf(void* buff,int count)</td>
<td width="65%">从Socket中读取count字节的数据到buff。</td>
</tr>
</tbody>
</table>
<p>TClientWinSocket</p>
<p>TClientWinSocket只增加了一个ClientType属性,用于决定与服务器的连接类型(参见<br>
TClientSocket->ClientType)。</p>
<p>TServerWinSocket</p>
<table
cellspacing=0 width="100%">
<tbody>
<tr>
<td>名称</td>
<td>类型</td>
<td>说明</td>
</tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -