如同上面的内容所描述的不论您使用UDP协议或是TCP协议Winsock控件都可以允许与远程的设备连接并且在相互之间交换数据因此依据上面的面熟而言不论您使用的是哪一种协议都可以扮演主机端和客户端的角色
同时当您在使用Winsock控件的过程中这个控件不会显示在正在执行的窗体之中换句话说Winsock控件是在后台运行的一种控件在执行过程之中不会具有任何选用可见的控件那么该如何使用Winsock控件呢?它可以被应用在那些类型的应用程序之中呢?以下所列出的内容是这个控件可以应用的大致范围
;将客户端所收集的数据传送给主机端
;点对点的文件传送
;聊天室应用程序
;电子公告栏
;voip(voice over TCP/ip)
因此当您希望建立上述类型的应用程序之前必须要学习如何选用适合的协议类型
如何选用适用的协议
当您准备开始使用Winsock控件之前首要的工作是如何选择适用的协议类型如同先前所述的您可以选择TCP 协议或是UDP协议中的一种但是这两种协议的差异点在哪里呢?虽然它们同样可以使用在Internet或是Internet环境之中但是主要的差异在于连接的状态以下是这两种协议的特点说明
;TCP协议是属于面向连接的协议所谓的面向连接协议是指——在您可以交换数据之前在两个终端设备之间必须连接成功同时在网络的基础理论之中都会特别强调TCP具有错误核对的功能也就是说在数据的传送过程中如果发生错误或是数据无法传达对方时TCP协议将会重复尝试着重新传送数据因此核对以及重新传送的能力因此起传输效率会比Internet协议或是巨域网络协议差一些(netBIEUIIPXAppleTalk)
;UDP协议是属于无面向连接协议这种协议为适用在两个设备之间适用于信息传送以及数据的传输方面但是在使用时必须注意当你将信息送出时对方可能已经离线因而无法接收到数据而您也无法实时察觉到对方已经离线此外使用UDP协议的最大数据传送量完全取决于网络的传输量因此此种协议较为适用于局域网络
因此当您在建立应用程序并且选用适当的协议之前务必先依据应用程序使用的环境来选择适用的协议
设置协议
当已经选择好适当的协议之后接下来将必须要设置协议的类型在Visable Basic之中共有两种设置协议的方式修改属性窗口以及程序代码设置以下是这两种设置方式的说明 ;修改属性窗口(见图)
;程序代码设置
WinsockProtocol=sckTCPProtocol
.TCP连接的基础
在使用TCP协议来建立应用程序的过程中首先必须决定应用程序是属于主机端
是客户端来决定应用程序所扮演的角色问题因此在建立应用程序的过程中如果您选择主机端时主机端的Winsock控件必须将特定的连接端口号设置在监听模式之中同时在客户端提出连接的请求时主机端可以允许客户端的连接请求并且完成连接的程序
因此一旦主机端与客户端连接成功之后在这个部设备之间即可开始传送数据以下的程序代码具有TCP连接的基本聊天室功能
TCP连接范例
在此笔者只做简单的程序介绍
;frmserver窗体的设计内容
如图所示
;frmserver的程序代码
private sub form_load()
设置本机连接端口的localport属性的内容
请注意!必须是整体值
tcpserverLocalPort=
将本机连接端口设置为监听模式
tcpserverListen
MeCaption=frmsever
LabelCaption=传送的文字
LabelCaption=接收的文字
打开frmclient窗体
frmClientShow
end sub
private sub tcpserver_connectionrequest(byval requestid as long)
如果tcpserver 控件的状态目前不是处于关
闭的状态时在允许远程设备连接时必须要关闭目前的控制的运行
if tcpserverstate<>sckclosed then tcpserverclose
允许远程设备使用必要的识别码(requestid)与主机进行连接
tcpserveraccept requestid
end sub
private sub txtsend_change()
当txtsend控件的内容发生变化时将txtsend控件的内容通过tcpserver控件senddata方
法将txtsend控件的内容传送给frmclient
tcpserversenddata txtsendtext
end sub
private sub tcpserver_dataarrival(byval bytestotal as long)
声明即将接收的数据类型
dim strdata as string
调用tcpserver控件的getdata方法将接收的数据以vbstring数据类型存放在strdata变量之中
Tcpservergetdata strdata vbstring
将strdata变量的内容存放在txtoutput控件之中
Txtreceivetext =strdata
End sud
;frmclient窗体的设计内容
窗体的配置内容如图
;程序的代码
private sub form_load()
指定远程主机的ip地址如果是localhost代表的ip地址为并且也代表本机
TcpclientRemoteHost=localhost
设置本机连接端口的localport属性的内容
请注意!必须是整体值
tcpclientremoteport=
设置窗体的标题内容
MeCaption=frmclient
Labelcaption=传送的文字
Labelcaption=接收的文字
Cmdconnectcaption=与主机连接
End sub
Private sub cmdconnect_click()
调用tcpclient控件的connect方法来初始化与主机的连接请求
nnect
end sub
private sub txtsend_change()
当txtsend控件的内容发生变化时立即调用tcpclient控件的senddata方法将txtsend控件的内容传送给主机
tcpclientsenddata txtsendtext
end sub
private sub tcpclient_dataarrival(byval bytestotal as long)
说明即将接收的数据类型
dim strdata as string
调用tcpclient控件的getdata方法将接收的数据以vbstring数据类型存放strdata变量之中
Tcpclientgetdata strdatavbstring
将strdata变量的内容存放在txtoutput控件之中
Txtreceivetext=strdata
End sub
;程序的执行结果
如何允许更多客户端同时连接
当您的应用程序架构是属于主从式架构时一般来说客户端应该不止一个而已但是如果每一个客户端使用的一组连接端口时那么如果有个客户端呢?如果有个客户端呢?那么究竟要增加多少个winsock控件呢?同时也得要分成(或是)组accept子程序接着每一部客户端都必须记得固定的连接端口号
其实您大可不必如此辛苦您可以利用Visable Basic控件数组的方式并利用监听用的数组元素(一般都是索引值)来触发ConnectRequest事件接下来再利用判别控件数组元素的连接状态来进行远程客户端连接以下的程序代码范例就是如何让许多远程用户连接到同一个连接端口号的程序代码的模板
private connmax as long
private sub form_load ()
dim I as integer
connmax =
sckserver()localport=
sckserver()listen
for I = to connmax
load sckserver(i)
next
end sub
private sub sckserver_connectionrequest(index as integerbyval requestid as long)
dim I as intege
for I = to connmax
if sckserver()state=sckclosed then
sckserver(I)accept requestid
end if
end if
end sub
在上述的程序范例中将会建立一个具有个元素的sckserver控件数组接着利用fornext循环的方式来设置加载sckserver控件数组元素或是判断数组元素是否正在连接中进而允许客户端连接至于sckserver控件数组总元素为的原因在于——connmax设置为再加上sckserver()因此总元素数量为
.UDP连接的基础
在 建立UDP的应用程序时其过程会比TCP协议简单许多这是由于UDP协议在数据传送之前可以不需要特别明确的连接方式但是在上述的TCP连接方式之中Winsocke控件必须设置在监听(Linsten)状态之下同时在客户端准备与主机进行连接时主机端也必须要使用Accept方法来允许客户端所要求的连接
反观在UDP协议方面双方仅仅需要使用Bind方法即可与对方连接并且传输数九因此UDP协议连接过程的处理方式确实比TCP简单许多下面介绍使用UDP协议来传送信息的过程
UDP的连接范例
在此只做简单的介绍
;窗体frm PeerA的设计内容
如图所示
;窗体的程序代码
Private Sub Form_Load()
′控件的名字为udpPeerA
With udpPeerA′重点:必须将 RemoteHost 的值修改为对方计算机的名字
RemoteHost= ″PeerB″
RemotePort = ′连接的端口号
Bind ′绑定到本地的端口
End With
frmPeerBShow′显示第二个窗体
End Sub
Private Sub txtSend_Change()
′在键入文本时立即将其发送出去
udpPeerASendData txtSendText
End Sub
Private Sub udpPeerA_DataArrival (ByVal bytesTotal As Long)
Dim strData As String
udpPeerAGetData strData
txtOutputText = strData
End Sub
;窗体frmpeerB的设计内容
如图所示
;窗体frmpeerB的程序代码
Private Sub Form_Load()
′控件的名字为 udpPeerB
With udpPeerB
′重点:必须将RemoteHost的值改为对方计算机的名字
RemoteHost= ″PeerA″
RemotePort = ′要连接的端口
Bind ′绑定到本地的端口上
End With
End Sub
Private Sub txtSend_Change()
′在键入后立即发送文本
udpPeerBSendData txtSendText
End Sub
Private Sub udpPeerB_DataArrival (ByVal bytesTotal As Long)
Dim strData As String
udpPeerBGetData strData
txtOutputText = strData
End Sub