背景:                 
[本书目录] [图书首页] [本书讨论区]  
链接地址:http://www.17xie.com/read-3405.html    注册17xie 一起来写书 实现您的出书梦想!

5Accept方法

格式:

Object.Accept requestID

说明:

仅适用于 TCP 服务器应用程序。在处理 ConnectionRequest 事件时用这个方法接受新连接。

ConnectionRequest事件有一个参数RequestID,该参数应该传给Accept方法。

应该在新的控件示例(不是侦听状态下的示例)中使用 Accept 方法。

6Bind方法

格式:

Object.Bind LocalPort, LocalIP

说明:

指定用于 TCP 连接的LocalPortLocalIP。如果有多协议适配卡,就用这个方法。其中,LocalPort表示建立连接的端口,LocalIP表示建立连接的本地 Internet 地址。

在调用 Listen 方法之前必须调用 Bind 方法。

10.2.4  Winsock控件的事件

Winsock控件的常用事件有:

1Connect事件

格式:

Object.Connect()

说明:

当一个Connect操作完成时发生。使用Connect事件确认已经成功建立了一个连接。

2Close事件

格式:

Object_Close()

说明:

当远程计算机关闭连接时出现。应用程序应正确使用Close方法关闭TCP连接。

3ConnectionRequest事件

格式:

Object_ConnectionRequest (requestID As Long)

说明:

当远程计算机请求连接时出现。仅适用于TCP服务器应用程序。在请求一个新连接时激活该事件。激活事件之后,RemoteHostIPRemotePort属性存储有关客户的信息。

4DataArrival事件

格式:

Object_DataArrival (bytesTotal As Long)

说明:

只有存在新数据时才激活此事件。其中,bytesTotal表示可获取的数据总数。可随时用BytesReceived属性检查可用的数据量。

5SendComplete事件

格式:

Object_SendComplete

说明:

在完成一个发送操作时触发此事件。

6SendProgress事件

格式:

Object_SendProgress (bytesSent As Long, bytesRemaining As Long)

说明:

在发送数据期间触发此事件。其中,bytesSent表示从上次激活事件以来已发送的字节数,bytesRemaining表示在发送缓冲区等待发送时的字节数。

实例101  Winsock控件编制局域网上的“聊天”程序

1.服务器端:

新建一个窗体,设置其MaxButton属性为False。在上面画两个文本框,设置其MultiLine属性为TrueScrollBars2-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属性为TrueScrollBars2-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.1LocalHost即可,其效果如图10-4所示。

10-4  在一台电脑上聊天

10.3  项目指导(一个简单的网页浏览器)

新建一个窗体,在上面画一个标签,一个组合框,七个命令按钮,一个计时器,一个状态栏(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控件显示网页源代码功能的窗体。

 

          


字数:10185    最后更新:1年以前 [09-06 04:03]我爱钱 修改
本页编辑者:我爱钱  
[前一页]:第十章  [后一页]:第九章
[在本页中加入书签] [收藏本书] [推荐本书]
  17xie论坛 > 本书讨论区 > 本页评论   (共0条)
发表评论

用户名称 匿名发表
评论内容
验证码

关于我们 | 版权声明 | 免责声明 | 诚聘英才 | 联系我们 | 合作伙伴 | 友情链接 | 广告合作 | 提交意见
Copyright © 2007 17xie.com 互联网协同写书平台 京ICP备08002671号