江门巡警大队:VB Winsock控件的使用与介绍

来源:百度文库 编辑:中财网 时间:2024/05/10 10:50:11

第一节:Winsock控件的介绍

Winsock控件的作用简单说就是可以用于两台或多台机器间通信,这里不多说这个控件的作用了,因为在以后的介绍中我们会了解到这个控件的强大功能的,如可以用来做聊天软件等……

废话不多说,来看看他有些什么重要的属性、方法和事件吧!

在VB6.0中的工具箱里默认情况下是没有这个控件的,添加方法如下:在工具箱上右击,选择[部件],然后在部件对话框中选择"MicrosoftWinsock Control6.0",后确定即可。如果没有这个复选框的话,请点击[浏览]按钮后在打开的[添加ActiveX控件]对话框选择MSWINSCK.ocx后选择打开,再点确定即可。Winsock控件在工具箱中图标为

Winsck的主要属性:

属性名
说明
BytesReceived 返回接收的数据,可以用GetData方法来获取它 LocalHostName 返回本机名 LocalIP 返回本机IP LocalPort 返回或设置本机所用的端口,如果为0则为随机产生 Protocol 返回通信所用的协议 RemoteHostName 返回通信对方的计算机名 RemoteHostIP 返回通信对方的IP State 返回Winscok的当前状态,取值如下
  • sckClosed(常量为0):关闭状态
  • sckOpen(常量为1):打开状态
  • sckListening(常量为2):侦听状态
  • sckConnectionPending(常量为3):连接状态
  • sckResolvingHost(常量为4):解析主机中
  • sckHostResolved(常量为5):已解析主机
  • sckConnecting(常量为6):正在连接
  • sckConnected(常量为7):已经连接
  • sckClosing(常量为8):客户端正在关闭
  • sckError(常量为9):连接发生错误

Winsock的主要方法:

方法名
作用
listen 使服务器程序处于侦听状态,等待客户端的连接请求 connect 用于客户端向远程发送一个连接请求,语法:Winsock.connect [IP,Port] Accept 用于服务器接收一个远程客户端的连接请求,语法:Winsock.Accept requestID sendData 用于向远程发送数据,语法:Winsock.sendData 数据 getData 用于接收远程发送来的数据,语法:Winsock.getData 变量 Close 关闭通信

Winsock的主要事件:

事件名
说明
Connect 当服务器接收客户端请求时,服务端发生的事件 DataArrival 有数据到达时发生的事件,可以在这个事件中来getData发送来的数据 ConnectionRequest 客户端用Connect方法时服务器发生的事件,可以在这个事件中来Accept一个连接请求 SendProgress 发送数据中发生的事件,可以在这个事件中来标示当前已经发送多少数据 SendComplete 发送数据完成发生的事件 Error 通信发生错误时发生的事件 Close 关闭通信时发生的事件

这节我们详细介绍了Winsock控件的属性、方法和事件等,只要拥有这些,我们就可以编很多功能强大的软件了。在接下来的几课中我们将以实例来说明Winsock的应用。

第二节:Winsock聊天器实例

上一节我们介绍了Winsock控件,这节我们将以一个聊天器的实例来说说如何应运Winsock控件进行计算机之间的通信。

我也做了一个聊天器,程序点击这里下载。

这节课我们做了用于通信的服务端和客户端,在制作他们之前,先看看服务端和客户端是如何设计的:(注:要复制本页代码时要注意去掉不正确的字符如?号)

服务端的设计:

1、设置好localPort作为侦听端口

2、使用listen使服务端处在侦听状态

3、客户端发出连接请求后触发ConnectionRequest事件

4、在ConnectionRequest中用Accept方法来接收客户端的连接请求

5、收发数据

客户端的设计:

1、设置RemoteHost,即你要连接IP

2、设置好RemotePort,即通信的端口号,要与服务端的一致

3、使用Connect方法向服务端发出连接请求

4、如果服务端同意连接请求则触发Connect事件

5、收发数据

服务端的制作:

界面如下:

服务器设计第一、二步的实现(窗体的Load事件):

Private Sub Form_Load()
        wskServer.LocalPort = 1024    ' 1、设置好localPort作为侦听端口
        wskServer.Listen      ' 2、使用listen使服务端处在侦听状态
End Sub

服务器设计第三、四步的实现(Winsock的Connect):

Private Sub wskServer_ConnectionRequest(ByVal requestID As Long)
        If wskServer.State <> sckClosed Then
                wskServer.Close     '这里要先关闭,要不会报错
                wskServer.Accept requestID      ' 4、在ConnectionRequest中用Accept方法来接收客户端的连接请求
        End If
End Sub

服务器设计第五步的实现:

Private Sub cmdSend_Click()
         wskServer.SendData txtMessage.Text     '发送数据
        txtContent.Text = vbCrLf & txtContent.Text & "我说:" & txtMessage.Text        '加到聊天记录中
        txtContent.Text=""
End Sub

Private Sub wskServer_DataArrival(ByVal bytesTotal As Long)
         Dim tempS As String
         wskServer.GetData tempS    '接收数据
         txtContent.Text = txtContent.Text & "对方说:" & tempS & vbCrLf        '加到聊天记录中
End Sub

将上面的程序生成一个EXE文件(名为:Server.exe),然后新建一个工程以制作客户端。

客户端的制作:

界面如下:

客户端设计第一、二、三步的实现:

Private Sub cmdConnect_Click()
         Dim IP As String
         IP = InputBox("请输入要连接的IP", "输入的IP", "127.0.0.1")       '连接的IP默认为本机
         wskClient.RemoteHost = IP      '1、设置RemoteHost,即你要连接IP
         wskClient.RemotePort = 1024        '2、设置好RemotePort,即通信的端口号,要与服务端的一致
         wskClient.Connect      '3、使用Connect方法向服务端发出连接请求
         cmdConnect.Enabled = False
End Sub

客户端设计第五步的实现(发送和接收代码和服务器一致,只不过控件名不同而已):

Private Sub cmdSend_Click()
         wskClient.SendData txtMessage.Text     '发送数据
        txtContent.Text = vbCrLf & txtContent.Text & "我说:" & txtMessage.Text        '加到聊天记录中
        txtContent.Text=""
End Sub

Private Sub wskClient_DataArrival(ByVal bytesTotal As Long)
         Dim tempS As String
         wskClient.GetData tempS    '接收数据
         txtContent.Text = txtContent.Text & "对方说:" & tempS & vbCrLf        '加到聊天记录中
End Sub

生成EXE文件(名为:Client.exe)。这样一个聊天器就做好了,在本机也可以试试,运行方法是先打开Server.exe,后打开Client.exe,然后在Client.exe点击连接按钮,连接地址为"127.0.0.1",确定,然后在下面的文本框输入内容点发送按钮即可。在建立连接后Server.exe的操作方法和Client.exe的操作方法一样。试试吧!

最后说一句:实际上我们会发现这样的聊天器怎么会分为两个部份呢,这样多不方便。实际上我们可以合成一个,即在一个窗体上放一个wskServer再放一个wskClient,这样就OK了,这里是为了更好的说明就放分成两个的。还有就是这个聊天器是基于TCP协议,这个协议保证了通信的数据不会丢失,这个协议只能一对一,但在实际中我们聊天的对象不会是一个人吧,这样就要用到可以一对多但不保证数据能完全到达UDP协议了,简单而言TCP用于一对一,而UDP可以运用于一对多。下一节我们将介绍用Winsock制作一个简单的Web服务器。

第三节:Winsock制作Web服务器

在本节中,我们将制作一个简单的Web服务器(点击这里下载源文件)。

按上节的说法,我们可以把Web服务器看是一个服务端,而浏览器则是一个一个的客户端,他们以一个相同的端口(如HTTP默认为80,FTP默认为21),所以就能通信。他们的工作流程大概如下:首先Web服务器在某一端口上等待浏览器的连接,然后浏览器向目标Web服务器发出要求浏览某一网页的请求,最后Web服务根据请求发送相应的网页源文件给浏览器。

用过ASP的都知道,我们有一个Web服务器叫IIS,这个服务器就是根据浏览器的请求而产生相应的源码然后发送到用户的浏览器上的。

别的不多说,界面很简单:

将文本框设置可以显示多行文本。为了有别于其他,我们这个Web服务器将使用端口124。制作流程如下:

在Form_Load事件中将服务器的侦听端口设为124:

Private Sub Form_Load()
        wskServer.LocalPort = 124
        wskServer.Listen
End Sub

在wskServer的ConnectionRequest事件中接受客户端(浏览器)的连接:

Private Sub wskServer_ConnectionRequest(ByVal requestID As Long)
        If wskServer.State <> sckClosed Then
                wskServer.Close
        End If
        wskServer.Accept requestID
End Sub

在wskServer控件的DataArrival事件中加当浏览器的请求文本来时发送源代码过去:

Private Sub wskServer_DataArrival(ByVal bytesTotal As Long)
        'Dim tempS As String
        'wskServer.GetData tempS
        'txtMain.Text = tempS
        txtMain.Text = txtMain.Text & "一个IP为[" & wskServer.RemoteHostIP & "]连接对象" & vbCrLf
        sendCode ("index.htm")
End Sub

这里在窗体模块(窗体声明)中加入一个发送源代码的sendCode的Sub过程:

Sub sendCode(fileName As String)
        Open App.Path & "\" & fileName For Input As #1
        Dim tempS As String
        Do While Not EOF(1)
                Line Input #1, tempS
                wskServer.SendData tempS
        Loop
        Close #1
End Sub

在cmdClose的Click事件中关闭窗体和服务:

Private Sub cmdClose_Click()
        wskServer.Close
        Unload Me
        End
End Sub

最后要在wskServer的SendComplete事件中加入如下代码:

Private Sub wskServer_SendComplete()
wskServer.Close
End Sub

这里制作好了,将工程文件保存在[C:\temp]文件夹中,然后自己做一个网页名为index.htm也放在[C:\temp]中。这时按F5运行,然后打开IE,输入:http://127.0.0.1:124,这下等网页的显示吧。

这只是一个简单的Web服务器,只能给你们说明一些原理,下面说几个问题:

1、我们如何知道客户端要的是哪个文件:

实际上我们给Web服务器发送连接会有一个文本请求来说明自己要的是什么文件,比如你把上面的wskServer的DataArrival事件中的前三行取消注释,再次按上面的方法来运行一次,不过这次把请求网址改为:"http://127.0.0.1/1.htm",那么文本框中会显示浏览器的请求文本为(以我的浏览器为例):

GET /1.htm HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: 127.0.0.1:124
Connection: Keep-Alive

你看第一行就知道客户端要的是什么文件了。

2、为什么在wskServer的SendComplete事件中要关闭服务器:

回答这个问题你可以将wskServer.Close注释起来再次运行,你会发现要很久(或要刷新网页)才会有页面出现,这是因为如果服务一直在的话,那么浏览器以为服务的数据没有传完,就一直等待,所以要在传送完源代码时关闭服务器。

3、能不能用Winsock做自己的浏览器:

能。我们可以用Winsock下载网页的源代码,但在VB中我们有另一个功能更强大的控件来做我们的浏览器,将在下节中说明具体的做法。

第四节:Winsock制作多客户服务器

我们前面的程序都只说到使用Winsock制作一对一的连接,实际上我们使用控件数组的话,那么可以制作一个多客户连接的服务器。不过本质上还是一对一,不过是服务器上不只一个Windsock而已。

我们在窗体上放一个Winsock,将他的Name改为sckServer,index属性改为0。然后就是代码了:

clientCount As Integer        '定义一个窗体级变量来记录客户的连接数。

Private Sub Form_Load()
clientCount = 0
sckServer(0).LocalPort = 2000       '设置好侦听端口
sckServer(0).Listen      '开始侦听
End Sub   

Private Sub sckServer_ConnectionRequest (Index As Integer, ByVal requestID As Long)
If Index = 0 Then
clientCount = clientCount + 1       '客户请求多一个
Load sckServer(clientCount)         '载入一个服务端为新增的客户服务
sckServer(clientCount).LocalPort = 0    '侦听端口为随机,不能设为2000,因为有sckServer(0)在使用了。
sckServer(clientCount).Accept requestID        '接受请求
End If
End Sub

看了代码明白了吧,所谓多客户服务器就是多个Winsock服务端在为客户服务而已,当然我们不用同步的时候也可以用一个Winsock来连续的关闭、连接来做多客户服务器也是可以的。

第五节:Web浏览器控件

在VB6.0中Web浏览器控件是WebBrowser,他的作用是让我们只要加入少量的代码,就能做出和IE功能一样强大的浏览器。(点击这里下载我制作的浏览器示例)

将WebBrowser添加到工具箱方法是:添加"部件"中选择Microsoft Internet Controls(SHDOCVW.dll),后点确定,WebBrowser在工具箱的图标为:

WebBrowser的功能强大是由众多方法、属性和行为组成的,下面说下它的主要属性、方法和行为。

WebBrowser的主要属性:

属性名
说明
LocationURL 返回当WebBrower中网页的URL LocationName 返回当WebBrower中网页的标题,即HTML中的Title标记

WebBrowser的主要方法:

方法名
作用
Navigate 浏览网页。如:WebBrower.Navigate "http://junqing124.update.vip2.com" GoBack 后退 GoForward 前进 GoHome 浏览主页 GoSearch 打开搜索页面 Refresh 刷新 Stop 停止

WebBrowser的主要事件:

事件名
说明
DownloadBegin 页面开始下载 DownloadComplete 页面下载完毕 TitleChange 浏览器的Title改变,即浏览新的页面

这里简单说了下WebBrower控件的部份属性、方法和行为。

下面是一个示例:

上面的四个按钮的名字分别为Command1、Command2、Command3、Command4,下面的文本框为Text1,最下面的是一个WebBrowser,名字为WebBrowser1

在Command1的Click事件加入:WebBrowser1.GoBack

在Command2的Click事件加入:WebBrowser1.GoForward

在Command3的Click事件加入:WebBrowser1.Refresh

在Command4的Click事件加入:If WebBrowser1.Busy = True Then WebBrowser1.Stop

在Text1的KeyPress事件加入:If KeyAscii = 13 Then WebBrowser1.Navigate Text1.Text

按F5运行,在文本输入网址后回车看看效果吧!