明辉站/技术开发/内容

VB5.0环境下Internet应用程序的开发

技术开发2023-08-02 阅读
[摘要]Internet有强大的通信功能,如文件传送、远程登录、E-mail、Internet Phone和Internet Fax等,它使传统的电信产业发生了巨大变化。同时,它是一个大型信息资源库,所含信息不仅包罗万象,而且日新月异。尤其是WWW(World Wide Web)的出现使全球信息联成一体,...
   Internet有强大的通信功能,如文件传送、远程登录、E-mail、Internet Phone和Internet Fax等,它使传统的电信产业发生了巨大变化。同时,它是一个大型信息资源库,所含信息不仅包罗万象,而且日新月异。尤其是WWW(World Wide Web)的出现使全球信息联成一体,并使千家万户可以随时共享这一人类伟大的资源。WWW的大规模兴起源于商业应用的普及和用户界面友好,越来越多的公司企业利用WWW网页作为商品促销或对客户服务的手段。不难想像,对于任何一位软件开发爱好者来说,学习开发Internet应用程序已经是一件刻不容缓的事情了。众所周知,使用Microsoft Visual Basic 5.0增强的Internet功能使我们能够在很短的时间内开发出实用的Internet网络应用程序,本文拟向读者介绍的就是有关这方面的内容。  

  Visual Basic是Microsoft公司面向Windows程序员的RAD(Rapid Application Development)工具,它的一大特点就是隐藏了很多纷繁而令人厌倦的Windows编程细节,而使开发人员将重点放在应用程序的功能上。当人们谈及Internet 应用程序的时候,由于类型太多,很难明确它们具体指的是什么,因此选择工具之前先了解所需要的应用程序类型是很重要的。Visual Basic为Internet的各种开发工作都提供了专门的技术,下表对Internet的各种用途进行了分类,并列举了完成各类任务所需的相应的Visual Basic工具。  

    

  表1.  

  Internet任务 Visual Basic工具  

  计算机间的直接通信 WinSock控件(MSWINSCK.OCX)  

  文件传输 Internet Transfer控件(MSINET.OCX)  

  Web浏览 WebBrowser控件(SHDOCVW.DLL)  

  在Microsoft Internet Explorer中运行的应用程序的开发 ActiveX文档  

  使用 Internet安装程序发布应用程序 Setup Wizard  

  用于超文本标记语言页面的组件开发 ActiveX控件  

  数据库应用程序 ActiveX文档  

   具有数据控件或使用ADODB对象的ASP  

   从服务器到客户机的事务/数据传输ASP  

    

  另一方面,随着WWW技术日新月异的发展,利用WWW技术构造企业内部网即Intranet,已经成为人们的一种共识,甚至Intranet应用程序的数量很可能已经超出了Internet应用程序,而本文描述的每项Internet任务同样也都适用于Intranet应用程序。  

  以下将通过实例分别讲述使用Visual Basic 5.0完成以下任务:①TCP(UDP)/IP编程;②创建Internet Explorer中运行的应用程序;③创建FTP浏览器。  

    

  二.TCP(UDP)/IP编程技术  

  TCP/IP协议是一种标准的企业网络协议,它也是Internet网最重要的网络互联协议,Microsoft Visual Basic 5.0的WinSock控件提供用于Internet的传输控制协议(TCP)和用户数据包网络协议(UDP)的底层访问,因而可以方便地用于创建通话应用程序,实现两台或多台联网计算机间的直接数据传输。下面介绍利用WinSock控件进行TCP/IP编程的主要步骤。  

  2.1 确定应用程序类型  

  使用TCP协议的应用程序,首先必须确定它是服务器端的还是客户端的。如果要创建一个服务器端的,就必须知道服务器计算机名或者IP地址(RemoteHost属性),还要知道进行“侦听”的端口(RemotePort属性),然后调用Connect方法。如果创建客户端应用程序,就应设置一个收听端口(LocalPort属性)并调用Listen方法。当客户计算机需要连接时就会发生ConnectionRequest事件。为了完成连接,可调用ConnectionRequest事件内的Accept方法。建立连接后,任何一方计算机都可以收发数据。为了发送数据,需调用SendData方法。当接收数据时会发生DataArrival事件。调用DataArrival事件内的GetData方法就可获取数据。  

  2.2 创建一个TCP服务器(Socket服务器)  

  1)创建新项目。  

  在File菜单中单击New Project,打开New Project对话框,然后双击Standard EXE图标,即建立一个新项目,并进入开发环境。  

  2)将缺省窗体的名称改为frmServer。  

  将一个Winsock控件拖到窗体上,并将该控件的名字改为tcpServer。请注意其中的Protocol属性应为sckTCPProtocol。在窗体上添加两个TextBox控件。将第一个命名为txtSendData,第二个命名为txtOutput(如图2.1所示)。  

    

  (图2.1)  

    

  3)为窗体添加如下的代码。  

  Private Sub Form_Load()  

  '将LocalPort属性设置为整数后调用Listen方法。  

  tcpServer.LocalPort = 2000  

  tcpServer.Listen  

  End Sub  

  要创建服务器,首先设定一个服务器端口号,并开始侦听是否有客户请求连接。程序中,LocalPort属性为服务器端口号,最好大于1000,以避免冲突。另外,对于众所周知的端口号,我们称之为周知口,例如:端口80专用于Web服务。用Listen方法开始侦听。  

  Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)  

  '检查控件的State属性是否为关闭的。  

  '如果不是,在接受新的连接之前先关闭此连接。  

  If tcpServer.State <> sckClosed Then tcpServer.Close  

  '接受具有requestID参数的连接。  

  tcpServer.Accept requestID  

  End Sub  

  当客户连接到本服务器时,产生ConnectRequest事件,在事件中接收客户的请求。  

  程序中的requestID参数表示客户请求连接的ID号,Accept方法接收一个请求连接。  

  Private Sub txtSendData_Change()  

  '名为 txtSendData 的 TextBox 控件中包含要发送的数据。用户往文本框中  

  '键入数据时,使用 SendData 方法发送输入的字符串。  

  tcpServer.SendData txtSendData.Text  

  End Sub  

  当我们需要向客户发送数据时,只需要调用SendData方法。  

  程序中使用SendData方法发送数据。  

  Private Sub tcpServer_DataArrival (ByVal bytesTotal As Long)  

  '为进入的数据声明一个变量。  

  '调用GetData方法,并将数据赋予名为txtOutput的TextBox的Text属性。  

  Dim strData As String  

  tcpServer.GetData strData  

  txtOutput.Text = strData  

  End Sub  

  当客户向本服务器发送的数据到达后,产生DataArrival事件,在事件中接收数据。  

  程序中的bytesTotal参数表示收到数据的总数,GetData方法接收数据。  

  Private Sub tcpServer_close(Index as Integer)  

  tcpServer.Close  

  tcpServer.Listen  

  End Sub  

  当客户关闭连接时,服务器会产生Close事件。在事件中关闭当前连接,重新开始侦听。其中使用Close方法关闭连接。当然服务器也可以主动调用Close方法关闭连接,例如在窗体关闭时关闭连接。  

  Sub frmServer_UnLoad(Cancel As Integer)  

  tcpServer.Close  

  End Sub  

  通过上面的步骤我们创建了一个简单的服务器端应用程序。为了使它能够工作,还必须为它创建一个客户端的应用程序。  

    

  2.3 创建一个 TCP客户端(Socket客户)  

  1)在项目中添加一个新的窗体,将其命名为frmClient。在窗体中添加一个Winsock控件,并将其命名为tcpClient。在frmClient中添加两个TextBox控件,将第一个命名为txtSend,第二个命名为txtOutput。在窗体上放一个CommandButton控件,并将其命名为cmdConnect。  

  2)将CommandButton控件的标题改为“连接”。  

  3)在窗体中添加如下的代码。  

  Private Sub Form_Load()  

  'Winsock控件名字为tcpClient。  

  '注意:要指定远程主机,可以使用IP地址(例如:“121.111.1.1”),  

  '也可以使用计算机的别名,如下所示:  

  tcpClient.RemoteHost = "HostServer1"  

   tcpClient.RemotePort = 2000  

  End Sub  

  要创建客户连接服务器,首先要设置服务器主机名,如IP地址、域名或计算机名等,然后设定服务端口号,最后连接到服务器上。在程序中:  

  RemoteHost属性表示服务器主机名;  

  RemotePort属性表示服务器端口号。  

  Private Sub cmdConnect_Click()  

  '调用Connect方法,初始化连接。  

   tcpClient.Connect  

  End Sub  

  Connect方法连接到服务器;  

    

  Private Sub txtSendData_Change()  

   tcpClient.SendData txtSend.Text  

  End Sub  

    

  Private Sub tcpClient_DataArrival (ByVal bytesTotal As Long)  

   Dim strData As String  

   tcpClient.GetData strData  

   txtOutput.Text = strData  

  End Sub  

    

  Private Sub tcpClient_Close(Index As Integer)  

  tcpClient.Close  

  End Sub  

    

  至此,我们创建了一个简单的客户/服务器模式的应用程序。我们可以将两者都运行起来:运行项目,然后单击“连接”。在两个窗体之一的txtSendData文本框中键入文本,可以看到同样的文字将出现在另一个窗体的txtOutput文本框中(如图2.2所示)。  

  图2.2  

  2.4 创建多客户服务器,接受多个连接请求  

  上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,不再需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后,在新的实例上调用Accept方法。  

  下面的代码假定名字为sckServer的窗体上有一个Winsock控件,它的Index属性被设置为0;控件是控件数组的一部分。在声明部分,声明了一个模块级的变量intMax。在窗体的Load事件中,intMax被设置为0,数组中第一个控件的LocalPort属性被设置为2000。然后调用控件的Listen方法,使之成为“侦听”控件。在连接请求到达时,代码将检测Index是否为0(“侦听”控件的值)。如果为0,侦听控件将增加intMax的值,并使用该号码来创建新的控件实例。然后使用新的控件实例接受连接请求。  

  Private intMax As Long  

  Private Sub Form_Load()  

   intMax = 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  

   intMax = intMax + 1  

   Load sckServer(intMax)  

   sckServer(intMax).LocalPort = 0  

   sckServer(intMax).Accept requestID  

   Load txtData(intMax)  

   End If  

  End Sub  

  在ConnectionRequest事件中,首先加载一个Socket控件,然后再用它来接收连接。  

    

  2.5 测试开发中应该注意的问题  

  1)协议的设置。  

  当WinSock控件与远程计算机建立连接时,亦可通过用户数据包协议(UDP)进行数据交换。在使用WinSock控件时,首先需要考虑使用什么协议。TCP应用程序应注意选择TCP协议。可按如下方式设置应用程序使用的协议:在“属性”窗口中单击“协议”,然后选择sckTCPProtocol或者sckUDPProtocol。也可以使用程序代码来设置Protocol属性,如下所示:  

  Winsock1.Protocol = sckTCPProtocol开发TCP应用程序应注意选择TCP协议。  

  2)注意确定“计算机的名字”。  

  计算机的名字用如下方式查找:  

  ①在计算机的“任务栏”上,单击“开始”。  

  ②在“设置”项中,单击“控制面板”。  

  ③ 双击“网络”图标。  

  ④ 单击“标识”选项卡。  

  ⑤ 在“计算机名称”框中可以找到计算机的名称。  

  上面找到的计算机名称可以作为RemoteHost属性的值。应用这一技术,我方便地完成了某企业信息管理系统,成功地实现了企业内部信息流的处理。虽然目前已有WWW浏览器、FTP等Internet互联网的应用工具,可以下载网上的信息,或实现网上工作站间的数据与文件的传输,但是用Windows Sockets则可方便地在用户自己设计的Windwos应用程序中通过Internet互联网传输数据,由于互联网的传输速度可以高达数十兆到数百兆比特每秒,因此,除了可以传递一般的文字、图形、声音等数据文件外,还可以用来传递实时的图像数据。  

    

  三.创建Internet Explorer中运行的应用程序  

  3.1 概述  

  Visual Basic 5.0版本是直接针对Internet的(也有人称是针对ActiveX的),Microsoft目前正在加紧开发用于WWW的Visual Basic(估计Visual Basic 6.0必将具有这一功能)。Visual Basic包括一个称为用户文档的新容器类型。用户文档构成了Visual Basic Document(也称ActiveX Document)文档的基础,并且生成的文档能够使用Microsoft Internet Explorer 3.0以上版本在Internet上浏览(见图3.1)。利用这一功能我们可以方便地创建动态Web页面。必须指出的是:使用Visual Basic创建的AcitveX Document与其他ActiveX Document略有不同。Visul Basic AcitveX Document与Visual Basic窗体大致相同,能在ActiveX Document容器中使用,但我们不能像运行独立应用程序那样运行它们。用户文档与窗体非常相似,可以包括控件、显示消息框、处理数据以及调用其他组件。用户文档与窗体的区别主要表现在:⑴应用程序中的其他部分无法得到用户文档中的数据,不能从文档外部引用用户文档中的属性值。⑵给予用户文档的应用程序需要Internet Explorer来运行,无法直接从Visual Basic中调试它们。⑶编译过的应用程序必须从HTM文件启动,它在显示VBD文件之前装入应用程序的代码组件。如果没有这个HTM文件,就不能启动编译过的EXE文件或从Internet Explorer中查看VBD文件。  

  3.2 ActiveX 文档对象的重要属性  

  在讲述创建ActiveX 文档的具体方法之前,我们先研究一下ActiveX 文档对象的重要属性。每个用户文档包含一个内置的Hyperlink对象,可用它来进入URLs和访问Internet Explorer的文档高速缓存。NavigateTo方法大致等价于窗体的Show方法。  

  事件 Show:当浏览器显示文档时发生;  

   Hide:当浏览器离开文档时发生;  

  属性 HyperLink:用于导航对象;  

   HyperLink对象有三个重要方法:  

   GoBack:前一页面;  

   GoFoward:后一页面;  

   Navigateto:导航;  

  例如HyperLink.Navigateto "http:/www.pccomputing.com"可以导航至《电子与电脑》杂志的主页。  

  3.3 用Visual Basic创建ActiveX Document的具体步骤  

  我们将开发具有如下功能的应用程序:创建两个ActiveX文档页面,第一个要求访问者输入密码,按动按钮后,若密码正确则进入第二页面;第二页面可以导航至中国教育与科研计算机网的主服务器。  

  1)在File菜单中单击New Project来打开一个New Project对话框,然后双击ActiveX Document exe图标,即可建立一个新项目并进入开发环境。  

  2)在“用户文档”的第一个UserDocument上添加两个Label控件、一个TextBox和一个CommandButton(如图3.1所示)。  

  (图3.1)。  

  添加如下代码:  

  Private Sub Command1_Click()  

  '核对Text1的文本,如果正确,则转至第二个文档页面。  

  If Text1.Text = "690909" Then  

  Hyperlink.NavigateTo "d:\ActiveX文档\UserDocument2.vbd"  

  End If  

  End Sub  

  3)从菜单“项目”中选择“添加用户文档”,在工程项目中添加第二个UserDocument,然后在UserDocument2上添加一个CommandButton(如图3.2所示)。  

  (图3.2)  

  添加如下的代码:  

  Private Sub Command1_Click()  

  '按动按钮,导航至《电子与电脑》杂志主页。  

  Hyperlink.NavigateTo "http:///www.pccomputing.com"  

  End Sub  

  4)编译文档。  

  5)使用Internet Explorer浏览器测试文档。  

  四.创建FTP浏览器  

  4.1 概述  

  FTP是Internet网上最早使用的文件传输程序。FTP的具体含义是文件传输协议(File Transfer Protocol),它是由支持Internet文件传输的各种规程所组成的集合。FTP的作用是使Internet用户能够将文件从一台计算机拷贝到另一台计算机,为实现Internet资源共享提供有力的保障。它不同于NFS(Network File System)和Netbios协议,一旦你要访问另一台计算机中的文件,任何时刻都要运行FTP,而且你只能拷贝文件到自己的机器中时来使用它。FTP是一种客户机/服务器结构,既需要客户机软件,又需要服务器软件。FTP客户机程序在用户计算机上执行,服务器程序在宿主计算机上执行。用户启动FTP客户机程序,通过输入户名和口令同远程主机上的FTP服务器建立连接,一旦成功,在Internet上用户计算机和宿主计算机之间就建立起一条命令链路(控制链路)。  

  4.2 用Visual Basic 5.0创建FTP浏览器的步骤  

  1) 我们将开发具有如下功能的应用程序:使用两个文本框和一个Internet Transfer控件。可在“地址”文本框中输入FTP服务器的URL(Uniform Resource Locator),然后从内容文本框中选择一个文件或目录。如果选择目录,则应用程序就会显示该目录。如果选择文件,则浏览器会将文件存于Windows Temp目录中。当用户按回车键时,“地址”文本框会通过设置Internet Transfer控件的URL属性并调用Execute方法来执行请求。当请求一个特定文件时,OpenURL方法实现相同的动作。然而,当你使用OpenURL方法返回目录的内容时,会返回指明目录内容的HTML源代码。  

  2)在File菜单中单击New Project,以便打开New Project对话框,然后双击“普通exe”图标,即建立一个新项目,并进入开发环境。  

  3)在窗体上添加一个Label控件、一个TextBox和一个ListBox(如图4.1所示)。  

  图4.1  

  4)添加如下代码:  

  Private Sub Text1_Click(KeyAscii As Integer)  

  If KeyAscii=Asc(vbCr) Then  

  KeyAscii=0  

  Text1.SelStart=0  

  Text1.SelLength=Len(Text1)  

  On Error goTo errOpenURL  

  InetBrowse.URL=Text1.Text  

  InetBrowse.Execute, "Dir"  

  Caption=inetBrowse.URL  

  End If  

  Exit Sub  

   ErrOpenURL:  

   Select Case Err.Number  

   Case icBadUrl  

   MsgBox"地址错误,请重新出入!"  

   Case icConnectFailed,icConnectionAborted,icCannotConnect  

   MsgBox"无法连入网络!"  

   Case icInetTimeout  

   MsgBox"连接超时!"  

   Case icExecuting  

   InetBrowse.Cancel  

  If inetBrowse.StillExecuting Then  

   Caption="不能取消请求!"  

   Else  

  Resume  

  End If  

  End Select  

  End Sub  

  当你提交一个请求时,设置错误陷阱很重要,尤其是icExecuting错误。Internet Transfer控件采用异步方式处理所有请求。然而,在同一时间仅能处理一个请求。如果你取消正在进行的请求,那么在重新开始前一定要检查StillExecuting属性。有些请求不能被取消,并且简单地使用Resume语句会导致死循环。  

  Private Sub List1_DblClick)  

  If List1.SelLength Then  

   If Right(List1.SelText1,1)="/" Then  

   Text1=Text1 & "/" Left(Text1.SelText,Text1.SelLength-1)  

  On Error goTo errBRowse  

  MsDir=Right(Text1.Len(Text1)-Len(inetBrowse.URL)  

  InetBrowse.Execute,"Dir"&msDir&"/*"  

  Else  

  MsDir=Right(Text1.Len(Text1)-Len(inetBrowse.URL))&"/"&""&msTempDir&List1.SelText  

  End If  

  End If  

  Exit Sub  

  ErrBrowse:  

  If Err=icExecuting Then  

   inetBrowse.Cancel  

   If inetBrowse.StillExecuting Then  

   MsgBox"不能取消请求!"  

  Else  

  Resume  

  End If  

  Else  

  Debug.Print Err&""&Err.Description  

  End If  

  End Sub  

   FTP命令用于在本地主机和远程主机间或两远程主机间传送文件。为了确保所传送的文件具有唯一的文件名,可使用一些选项来管理文件名,以便于适应接收主机的需要。用户能通过使用“anonymous”登录进行公共文件访问。  

   Internet Transfer控件的Books Online文档展示用于创建FTP浏览器的程序片段,这里就不再详细叙述了。

……

相关阅读