5.Accept方法
格式:
Object.Accept requestID
说明:
仅适用于 TCP 服务器应用程序。在处理 ConnectionRequest 事件时用这个方法接受新连接。
ConnectionRequest事件有一个参数RequestID,该参数应该传给Accept方法。
应该在新的控件示例(不是侦听状态下的示例)中使用 Accept 方法。
6.Bind方法
格式:
Object.Bind LocalPort, LocalIP
说明:
指定用于 TCP 连接的LocalPort和LocalIP。如果有多协议适配卡,就用这个方法。其中,LocalPort表示建立连接的端口,LocalIP表示建立连接的本地 Internet 地址。
在调用 Listen 方法之前必须调用 Bind 方法。
Winsock控件的常用事件有:
1.Connect事件
格式:
Object.Connect()
说明:
当一个Connect操作完成时发生。使用Connect事件确认已经成功建立了一个连接。
2.Close事件
格式:
Object_Close()
说明:
当远程计算机关闭连接时出现。应用程序应正确使用Close方法关闭TCP连接。
3.ConnectionRequest事件
格式:
Object_ConnectionRequest (requestID As Long)
说明:
当远程计算机请求连接时出现。仅适用于TCP服务器应用程序。在请求一个新连接时激活该事件。激活事件之后,RemoteHostIP和RemotePort属性存储有关客户的信息。
4.DataArrival事件
格式:
Object_DataArrival (bytesTotal As Long)
说明:
只有存在新数据时才激活此事件。其中,bytesTotal表示可获取的数据总数。可随时用BytesReceived属性检查可用的数据量。
5.SendComplete事件
格式:
Object_SendComplete
说明:
在完成一个发送操作时触发此事件。
6.SendProgress事件
格式:
Object_SendProgress (bytesSent As Long, bytesRemaining As Long)
说明:
在发送数据期间触发此事件。其中,bytesSent表示从上次激活事件以来已发送的字节数,bytesRemaining表示在发送缓冲区等待发送时的字节数。
实例10.1 用Winsock控件编制局域网上的“聊天”程序
1.服务器端:
新建一个窗体,设置其MaxButton属性为False。在上面画两个文本框,设置其MultiLine属性为True,ScrollBars为2-Vertical,再画一个标签,两个命令按钮,一个Winsock控件。其界面如图10-2所示。

图10-2 “聊天”程序服务器端设计界面
注意:工具箱中默认没有Winsock控件,添加方法为:单击“工程”菜单的“部件”命令,在弹出的“部件”对话框中选择“控件”选项卡,向下拖动滚动条,找到“Microsoft Winsock Control 6.0”,选中这个ActiveX控件,单击【确定】即可。
在其代码窗口中输入如下代码:
Option Explicit
Private Sub Form_Load()
Me.Caption = "服务器端"
Label1.Caption = "请在下面的文本框中输入数据(Alt+Enter发送):"
Command1.Caption = "发送":Command1.Enabled = False
Command2.Caption = "退出":Text1.Text = Space(0)
Text1.Locked = True:Text1.TabStop = False
Text2.Text = Space(0):Text2.TabIndex = 0
Winsock1.LocalPort = 12345:Winsock1.Listen
End Sub
Private Sub Command1_Click()
Dim Temp As Integer
If Winsock1.State = sckConnected Then
Winsock1.SendData Text2.Text
Else
Temp = MsgBox("连接失败,可能客户端程序尚未准备好", , "连接失败")
End If
Command1.Enabled = False
End Sub
Private Sub Command2_Click()
Winsock1.Close:Unload Me
End Sub
Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
If (Shift And vbAltMask) > 0 And KeyCode = 13 And Command1.Enabled Then
Command1_Click
End If
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
Command1.Enabled = True
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then
Winsock1.Close
End If
Winsock1.Accept requestID
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim ComingData As String
Winsock1.GetData ComingData
If CStr(ComingData) = "QUIT" Then
Winsock1.Close:Winsock1.LocalPort = 12345
Winsock1.Listen:ComingData = "对方已下线!"
End If
Text1.Text = ComingData:Text1.Refresh
End Sub
Private Sub Winsock1_Close()
Winsock1.Close:Form_Load
End Sub
2.客户端:
新建一个窗体,设置其MaxButton属性为False。在上面画三个文本框,其中,设置前两个文本框的MultiLine属性为True,ScrollBars为2-Vertical,再画两个标签,两个命令按钮,一个Winsock控件。其界面如图10-3所示。

图10-3 “聊天”程序客户端设计界面
在其代码窗口中输入如下代码:
Option Explicit
Private Sub Form_Load()
Me.Caption = "客户机端"
Label1.Caption = "请在下面的文本框中输入数据(Alt+Enter发送):"
Label2.Caption = "请输入对方的IP地址或计算机名"
Command1.Caption = "连接服务器":Command2.Caption = "退出"
Text1.Text = Space(0):Text1.TabStop = False
Text2.Text = Space(0):Text3.TabIndex = 0
Text3.Text = "LocalHost":Text1.Locked = True
Text2.Locked = True
End Sub
Private Sub Command1_Click()
Dim Temp As Integer
If Command1.Caption = "连接服务器" Then
If Winsock1.State <> sckClosed Then
Winsock1.Close
End If
Winsock1.RemoteHost = Trim(Text3.Text)
Winsock1.RemotePort = 12345:Winsock1.Connect
Command1.Caption = "发送":Text2.Locked = False
Text2.TabIndex = 0
Else
If Winsock1.State = sckConnected Then
Winsock1.SendData Text2.Text
Else
Temp = MsgBox("连接失败,可能服务器端程序尚未准备好", , "连接失败")
End If
End If
Command1.Enabled = False
End Sub
Private Sub Command2_Click()
If Winsock1.State = sckConnected Then
Winsock1.SendData "QUIT"
End If
Unload Me
End Sub
Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
If (Shift And vbAltMask) > 0 And KeyCode = 13 And Command1.Enabled Then
Command1_Click
End If
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
Command1.Enabled = True
End Sub
Private Sub Text3_Change()
Command1.Caption = "连接服务器":Command1.Enabled = True
Text2.Locked = True
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim ComingData As String
Winsock1.GetData ComingData:Text1.Text = ComingData
Text1.Refresh
End Sub
Private Sub Winsock1_Close()
Winsock1.Close:Unload Me
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Dim Temp As Integer
Temp = MsgBox("连接失败,可能是IP地址或对方计算机名错误", vbOKOnly, "连接出现问题")
Text3.SelStart = 0:Text3.SelLength = Len(Text3.Text)
Text3.SetFocus
End Sub
编译这两个窗体,在局域网的一台机器上运行服务器端程序,在另一台机器上运行客户端程序,在客户端程序的相应文本框中输入服务器端机器的IP地址或计算机名,双方即可开始聊天。
如果不具备局域网条件,也可以在一台机器上同时运行服务器端和客户端程序,此时,在客户端程序的相应文本框中输入127.0.0.1或LocalHost即可,其效果如图10-4所示。

图10-4 在一台电脑上聊天
新建一个窗体,在上面画一个标签,一个组合框,七个命令按钮,一个计时器,一个状态栏(StatusBar)控件,一个网页浏览器(WebBrowser)控件,其布局如图10-5所示。

图10-5 一个简单的网页浏览器设计界面布局
注意:工具箱中默认没有状态栏和网页浏览器控件,添加这两个控件的方法为:单击“工程”菜单的“部件”命令,在弹出的“部件”对话框中选择“控件”选项卡,向下拖动滚动条,找到“Microsoft Windows Common Controls 6.0”和“Microsoft Internet Controls”两个ActiveX控件,选中它们,单击【确定】即可。
在其代码窗口中输入如下代码:
Option Explicit
Private Sub Form_Load()
Dim VarPanel As Panel
Dim i As Integer
Me.Caption = "一个简单的网页浏览器":Timer1.Interval = 1000
For i = 1 To 4 '第一个面板已存在,故共五个面板
Set VarPanel = StatusBar1.Panels.Add()
Next i
Command1.Caption = "后退":Command2.Caption = "前进":Command3.Caption = "停止"
Command4.Caption = "刷新":Command5.Caption = "主页":Command6.Caption = "搜索"
Command7.Caption = "Go!":Label1.Caption = "地址:"
Combo1.AddItem ("http://www.baidu.com")
Combo1.AddItem ("http://www.google.com")
Combo1.AddItem ("http://antwrp.gsfc.nasa.gov/apod/archivepix.html")
Combo1.AddItem ("http://www.sogua.com"):Combo1.AddItem ("C:\")
Combo1.ListIndex = 0:StatusBar1.Panels(2).Style = sbrCaps
StatusBar1.Panels(3).Style = sbrNum:StatusBar1.Panels(4).Style = sbrIns
End Sub
Private Sub Form_Resize()
WebBrowser1.Top = Combo1.Top + Combo1.Height + 30
WebBrowser1.Left = 20:WebBrowser1.Width = Me.ScaleWidth
WebBrowser1.Height = Me.ScaleHeight - WebBrowser1.Top - StatusBar1.Height
StatusBar1.Panels(1).Width = Me.Width * 4.5 / 9
StatusBar1.Panels(2).Width = Me.Width * 0.5 / 9
StatusBar1.Panels(3).Width = Me.Width * 0.5 / 9
StatusBar1.Panels(4).Width = Me.Width * 0.5 / 9
StatusBar1.Panels(5).Width = Me.Width * 3 / 9
End Sub
Private Sub Timer1_Timer()
Dim WhichWeek As String
Select Case Weekday(Date)
Case 1
WhichWeek = "星期日"
Case 2
WhichWeek = "星期一"
Case 3
WhichWeek = "星期二"
Case 4
WhichWeek = "星期三"
Case 5
WhichWeek = "星期四"
Case 6
WhichWeek = "星期五"
Case 7
WhichWeek = "星期六"
End Select
StatusBar1.Panels(5).Text = Now & Space(1) + WhichWeek
If WebBrowser1.LocationURL <> Space(0) Then
If WebBrowser1.Busy = False Then
StatusBar1.Panels(1).Text = "完成"
Else
Combo1.Text = WebBrowser1.LocationURL
StatusBar1.Panels(1).Text = "正在打开网页"+WebBrowser1.LocationURL+"......"
End If
End If
Me.Caption = WebBrowser1.LocationName
End Sub
Private Sub WebBrowser1_CommandStateChange(ByVal Command As Long, ByVal Enable As Boolean)
Select Case Command
Case CSC_NAVIGATEFORWARD
If Enable = False Then
Command2.Enabled = False
Else
Command2.Enabled = True
End If
Case CSC_NAVIGATEBACK
If Enable = False Then
Command1.Enabled = False
Else
Command1.Enabled = True
End If
End Select
End Sub
Private Sub WebBrowser1_DownloadComplete()
On Error Resume Next:Me.Caption = WebBrowser1.LocationName
End Sub
Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
Dim i As Integer
For i = 0 To Combo1.ListCount - 1
If Combo1.List(i) = WebBrowser1.LocationURL Then
Exit For
End If
Next i
If i = Combo1.ListCount Then
Combo1.AddItem WebBrowser1.LocationURL, 0:Combo1.ListIndex = 0
End If
End Sub
Private Sub Command1_Click()
WebBrowser1.GoBack
End Sub
Private Sub Command2_Click()
WebBrowser1.GoForward
End Sub
Private Sub Command3_Click()
WebBrowser1.Refresh
End Sub
Private Sub Command4_Click()
WebBrowser1.GoHome
End Sub
Private Sub Command5_Click()
WebBrowser1.GoSearch
End Sub
Private Sub Command6_Click()
WebBrowser1.Stop
End Sub
Private Sub Command7_Click()
WebBrowser1.Navigate Combo1.Text
End Sub
Private Sub Combo1_Click()
Command7_Click
End Sub
Private Sub Combo1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
Command7_Click
End If
End Sub
运行此窗体,其运行界面如图10-1所示。此程序的功能介绍可参见本章的项目界面及其要求部分,这里不再赘述。
1.在本章项目的基础上,实现将最后一次浏览过的网页及退出时窗口的状态写入文件中,以便下一次启动该应用程序时,直接打开上次退出时正在浏览的网页,窗口仍然保持上一次关闭时的状态。
2.在上一题的基础上,给窗体添加一个进度条控件(ProgressBar),结合WebBrowser控件的ProgressChange事件,实现显示网页下载进度的功能。
3.用Winsock控件编写一个可以在局域网中“聊天”的程序。
4.在上一题的基础上,要求用户输入昵称,双方昵称显示在聊天记录窗口当前数据前面。聊天结束,将聊天记录保存到磁盘上。
5.制作一个用Winsock控件显示网页源代码功能的窗体。