1、第11章 多媒体与网络11.1.1 媒体播放器概述u1.媒体播放器 Multimedia MCI 控件管理媒体控制接口(MCI)设备上多媒体文件的录制与回放。实际上,这种控件是一组按钮,用来向诸如声卡、MIDI 序列发生器、CD-ROM 驱动器、视频 CD 播放器、视频磁带记录器及播放器等设备发出 MCI 命令。MCI 控件还支持 Windows(*.avi)视频文件的回放。要在VB工程中使用Multimedia MCI 控件,需要在菜单上选择“工程部件”选项,在“部件”对话框的“控件”选项卡中找到 项,添加到工程中。添加后,在工具箱中将出现图标。设计时,将 Multimedia MCI 控件
2、添加到一个窗体上,如图11-1所示 图11-1 Multimedia MCI 控件添加到窗体上u将按钮分别定义为 Prev(上一首)、Next(下一首)、Play(播放)、Pause(暂停)、Back(后退)、Step(步进)、Stop(停止)、Record(录音)和 Eject(弹出)。需要使用或显示某几个按钮时,可以将其中的按钮属性Visible 和 Enabled设置为True;否则,设置其属性值为false。u2.主要属性u(1)Command 属性:指定将要执行的 MCI 命令。u语法:Command=cmdstring$u说明:参数 cmdstring$给出了将要执行的 MCI 命
3、令的名称:Open、Close、Play、Pause、Stop、Back、Step、Prev、Next、Seek、Record、Eject、Sound 或 Save。这些命令被立即执行,并将错误代码存放在 Error 属性中。u表11-1描述了所有的命令及其使用的属性。如果没有对某个属性进行设置,它既可以使用默认值(给出在属性名后的括号中),也有可能不使用该属性(没有列出默认值)。命令描述/所用的属性Open使用 MCI_OPEN 命令打开一设备。Notify(False)Wait(True)SharableDeviceTypeFileNameClose使用 MCI_CLOSE 命令关闭一设备
4、。续表Notify(False)Wait(True)Play使用 MCI_PLAY 命令播放一设备。Notify(True)Wait(False)FromToPause使用 MCI_PAUSE 命令暂停播放或记录。如果在设备已经暂停时执行这一命令,使用 MCI_RESUME 命令重新开始播放或记录。Notify(False)Wait(True)Stop使用 MCI_STOP 命令停止播放或记录。Notify(False)Wait(True)Back使用 MCI_STEP 命令向后单步。Notify(False)Wait(True)Frames续表Step使用 MCI_STEP 命令向前单步。N
5、otify(False)Wait(True)FramesPrev使用 Seek 命令定位到当前曲目的开始部分。如果在上一次 Prev 命令之后三秒之内再次执行这一命令,那么就定位到上一个曲目的开始部分,如果已经处在第一个曲目内,那么就只是定位到第一个曲目的开始部分。Notify(True)Wait(False)FromToRecordmode(0Insert)Eject使用 MCI_SET 命令将媒体弹出。Notify(False)Wait(True)Sound使用 MCI_SOUND 命令播放声音。Notify(False)Wait(False)FileNameSave使用 MCI_SAVE
6、 命令保存打开的文件。Notify(False)Wait(True)FileName续表其中:u1)DeviceType 属性:指定要打开的 MCI 设备的类型。语法:DeviceType=device$说明:参数 device$是要打开的 MCI 设备的类型,例如:AVIVideo、CDAudio、DAT、DigitalVideo、MMMovie、其它、Overlay、扫描仪、序列发生器、VCR、视盘或 WaveAudio。打开简单设备(如不使用文件的音频 CD)时,该属性必须设置。如果文件的扩展名没有指定将要使用的设备,打开复杂 MCI 设备时也必须设置该属性。u2)Wait属性:决定 M
7、ultimedia MCI 控件是否要等到下一条 MCI 命令完成,才能将控件返回应用程序。在设计时,该属性不可用。对该属性赋值时,只对下一条 MCI 命令有效。后面的 MCI命令会一直忽略 Wait 属性,除非用另外一个值(不同的或可标识的)为它赋值。u3)Sharable属性:决定多个程序能否共享同一台MCI设备。若取值为False,表示其它控件或应用程序不能访问这台设备;若取值为True,表示多个控件或应用程序能够打开这台设备。u4)Notify属性:决定下一条 MCI 命令是否使用 MCI 通知服务。如果被设置为True,则Notify属性在下一条 MCI 命令完成时产生一个回调事件(
8、Done)。设计时该属性不可用。(2)UpdateInterval 属性:规定两次连续的 StatusUpdate 事件之间的毫秒数。语法:UpdateInterval=milliseconds%说明:参数 milliseconds%规定事件之间的毫秒数。如果毫秒数是 0,表明没有 StatusUpdate 事件发生。u3.主要事件 (1)StatusUpdate 事件(Multimedia MCI 控件):按 UpdateInterval 属性给定的时间间隔自动地发生。语法:Private Sub MMControl_StatusUpdate()说明:该事件允许应用程序更新显示,以通知用户当
9、前 MCI 设备的状态。应用程序可以从 Position、Length 和 Mode 等属性中获得状态信息。u(2)Done 事件:当 Notify 属性为 True 的 MCI 命令结束时发生。语法:Private Sub MMControl_Done(NotifyCode As Integer)说明:参数 NotifyCode 表示 MCI 命令是否成功。可以是表11-2中的任意设置值。表11-2 参数 NotifyCode的设置值值设置值/Result1mciSuccessful命令成功的执行。2mciSuperseded命令被其它命令所替代。4mciAborted命令被用户中断。8mc
10、iFailure命令失败。11.1.2 简单媒体播放器u例11-1 制作播放WAV MP3 mid等音频文件的播放器。u分析u播放文件一般步骤:u设置设备打开的属性;u指定播放文件;u打开设备,开始播放;u播放完毕,关闭设备。u建立工程u新建窗体,命名为frmWAV。向窗体添加一个MCI控件,一个通用对话框控件,四个按钮,五个label控件,一个文本框控件,界面布局如图11-2所示。Text1cmdOpenCommonDialog1MMControl1cmdPlaycmdPausecmdCloseLabel2Label3图11-2 界面布局u程序代码u打开文件按钮代码uPrivate Sub
11、cmdOpen_Click()u 未打开文件前,让播放暂停关闭按钮不可用u cmdPlay.Enabled=Falseu cmdPause.Enabled=Falseu cmdClose.Enabled=Falseu 选择文件对话框u CommonDialog1.DialogTitle=选择播放文件u CommonDialog1.Filter=*.wav|*.wav|*.mid|*.mid|*.mp3|*.mp3u CommonDialog1.FileName=u CommonDialog1.ShowOpenu u 如果选择了文件,则设置MCI属性u If CommonDialog1.File
12、Name Thenu Text1.Text=CommonDialog1.FileNameu 打开文件前,先停止上一次的播放u MMControl1.Command=closeu u MMControl1.FileName=Text1.Textu MMControl1.DeviceType=u MMControl1.Command=openu u 显示文件播放长度u Label2.Caption=ToHMS(MMControl1.Length)u u 出发StatusUpdate 事件,在该事件中,得到当前播放进度u MMControl1.UpdateInterval=100u u cmdPla
13、y.Enabled=Trueu End IfuEnd Subu开始播放uPrivate Sub cmdPlay_Click()u MMControl1.Command=playu cmdPlay.Enabled=Falseu cmdPause.Enabled=Trueu cmdClose.Enabled=TrueuEnd Subu暂停播放uPrivate Sub cmdPause_Click()u MMControl1.Command=pauseu u cmdPlay.Enabled=Trueu cmdPause.Enabled=Falseu cmdClose.Enabled=TrueuEnd
14、 Subu停止播放uPrivate Sub cmdClose_Click()u MMControl1.Command=closeu u cmdPlay.Enabled=Falseu cmdPause.Enabled=Falseu cmdClose.Enabled=FalseuEnd Subu显示播放进度uPrivate Sub MMControl1_StatusUpdate()u Label3.Caption=ToHMS(MMControl1.Position)u 播放完毕,循环播放u If MMControl1.Position=MMControl1.Length Thenu MMContr
15、ol1.Command=prevu MMControl1.Command=playu End IfuEnd Subu转换为时分秒格式uFunction ToHMS(Ts As Long)As Stringu Ts=Ts/1000u hh=Ts 3600u mm=(Ts Mod 3600)60u ss=(Ts Mod 3600)Mod 60u u ToHMS=Format(hh,00)&;&Format(mm,00)&;&Format(ss,00)uEnd Functionu运行结果u单击“打开文件”按钮,选择MAV MID 或 MP3 文件后,“播放”按钮可用;单击“播放”按钮,label3将
16、显示播放进度;控制“暂停”或“停止”按钮,实现相应的操作。显示效果如图11-3所示。u一般情况下,如果要使用自定义按钮代替MCI操作按钮,MCI控件应将Visible属性设置为false,让其不可见。图11-3 播放器运行结果11.1.3 录音与放音u例11-2 通过电脑麦克风录制声音文件,保存到本机,并回放该文件。u分析u录制文件的一般步骤如下:u设置设备打开的属性;u指定录制文件保存的位置;u打开设备,开始录制;u录制完毕,保存文件;u关闭设备。u使用 Multimedia MCI 控件记录音频信号之前,应打开一个新的文件,以保证记录声音的数据文件格式与系统记录格式完全兼容。关闭 MCI设
17、备前,应该发出 MCI Save 命令,把记录的数据保存到文件中去。u建立工程u添加窗体frmRec,向窗体添加MCI控件及四个按钮控件,分别命名为cmdRec、cmdPause、cmdSave和cmdPlay,如图11-4所示。u程序代码u开始录音uPrivate Sub cmdRec_Click()u MMControl1.Wait=Trueu MMControl1.DeviceType=WaveAudiou MMControl1.FileName=c:myRec.wav 必须先设置文件名u MMControl1.Command=openu MMControl1.Command=Recor
18、duEnd Subu暂停和继续录音uPrivate Sub cmdPause_Click()uIf cmdPause.Caption=暂停录音 Thenu cmdPause.Caption=继续录音u MMControl1.Command=pauseuElseu cmdPause.Caption=暂停录音u MMControl1.Command=RecorduEnd IfuEnd Subu保存录制的文件uPrivate Sub cmdSave_Click()u MMControl1.Command=Saveu MMControl1.Command=CloseuEnd Subu回放录音文件uPr
19、ivate Sub cmdPlay_Click()u MMControl1.Wait=Trueu MMControl1.DeviceType=WaveAudiou MMControl1.FileName=c:myRec.wavu MMControl1.Command=openu MMControl1.Command=playuEnd SubcmdReccmdPausecmdSavecmdPlayMMControl1图11-4 界面布局 运行结果 如图11-5所示。u 运行结果 如图11-5所示。图11-5 运行结果。为代码简单起见,未对按钮之间的操作逻辑进行控制。请读者完善例11-211.2
20、Internet 传输控件u1.Internet 传输控件uInternet Transfer 控件(以下简称称inet控件)支持超文本传输协议(HTTP)和文件传输协议(FTP),它们是 Internet 网上使用最广泛的两种协议。u使用 HTTP 协议可以连接全球信息网(World Wide Web)服务器,以检索 HTML 文档。使用 FTP 协议可以在 FTP 服务器上登录,以下载和加载文件。UserName 和 Password 属性可让用户在要求验证身份的私有服务器上登录。另外,也可以连接公用的 FTP 服务器,并下载文件。Execute 方法支持普通的 FTP 命令,如 CD 和
21、 GET。u要使用inet控件,需要在菜单栏上选择“工程部件”选项,在“部件”对话框的“控件”选项卡中找到 项,添加到工程中。添加后,在工具箱中将出现 图标。u2.主要属性u(1)URL属性:设置或返回 Execute 或 OpenURL 方法使用的 URL。uURL 属性至少必须包含一个协议(FTP或HTTP)和一个远程主机名。uURL 属性可以是目录或文件。例如,下面两个 URLs 都是有效的:u设置URL,仅返回文件目录:uInet1.URL=HTTP:/u该URL将返回文件的文本:uInet1.URL=HTTP:/ OpenURL 方法(同步地),将产生错误;如果请求使用 Execut
22、e 方法,将引发带错误码的 StateChanged 事件。把该属性设置为 0,则意味着不限定等待时间。u(3)Protocol 属性:设置或返回一个值,指定和Execute方法一起使用的协议。表11-3 Protocol 的有效设置值常数值描述icUnknown0未知的。icDefault1缺省协议。icFTP2FTP。文件传输协议。icReserved3为将来预留。icHTTP4HTTP。超文本传输协议。icHTTPS5安全HTTP。u(4)UserName属性:设置或返回与请求一起发送到远程计算机的名称。如果该属性为空,提出请求时该控件将把“anonymous”作为用户名来发送。u(5)
23、Password属性:设置或返回一个密码,该密码将和请求一道被发送,用以在远程计算机上登录。如果该属性为空,控件将发送一个缺省的密码。u3.主要方法u(1)Execute 方法u作用作用:执行对远程服务器的请求。只能发送对特定的协议有效的请求。u语法格式语法格式:Execute url,operation,data,requestHeadersuExecute 属性的语法包含以下部分:uurl:可选,字符串,指定控件将要连接的 URL。如果这里未指定 URL,将使用 URL 属性中指定的 URL。uOperation:可选,字符串,指定将要执行的操作类型。支持的操作列表参见下面的“设置值”。u
24、Data:可选,字符串,指定用于操作的数据(参见下面的“设置值”)。urequestHeaders:可选,字符串,指定由远程服务器传来的附加的标头。u格式:header name:header value vbCrLfu(2)OpenURL方法u打开并返回指定 URL 的文档,文档以变体型返回。u语法格式:OpenUrl url,datatypeu其中:uurl:必需的,被检索文档的 URL。uDatatype:可选,整数,如“设置值”所示,指定数据类型。uDatatype的设置值:uicString 0:缺省值,把数据作为字符串来检索。uicByteArray 1:把数据作为字节数组来检索。
25、u4.主要事件uInet控件只有一个事件:StateChanged 事件。该事件在连接中状态发生改变时触发。u事件格式:tateChanged(ByVal State As Integer)u其中,State为整数,取值见表11-4的“设置值”,用于指定状态。表11-4 State 的设置值常数值描述icNone0无状态可报告。icHostResolvingHost1该控件正在查询所指定的主机的 IP 地址。icHostResolved2该控件已成功地找到所指定的主机的 IP 地址。icConnecting3该控件正在与主机连接。icConnected4该控件已与主机连接成功。icReques
26、ting5该控件正在向主机发送请求。icRequestSent6该控件发送请求已成功。icReceivingResponse7该控件正在接收主机的响应。icResponseReceived8该控件已成功地接收到主机的响应。icDisconnecting9该控件正在解除与主机的连接。icDisconnected10该控件已成功地与主机解除了连接。icError11与主机通讯时出现了错误。icResponseCompleted12该请求已经完成,并且所有数据均已接收到。u使用inet控件的一般思路:设置URL属性,指定登录的服务器;如果登录的是FTP服务器,需要指定用户名和密码,可以匿名登录的FT
27、P服务器无需设置其UserName和Password属性。然后通过Execute方法传递get命令参数下载文件;传递send命令参数上传文件.11.2.2 利用控件上传下载文件u例11-3 u分析u要正确运行本例,需要在本地建立FTP服务器,在FTP服务器中存放有A6.MP3文件或其它任意文件。此外,也可以指定任意一个实际存在的FTP服务器,输入用户名和密码进行下载和上传文件。u建立工程u添加三个文本框,分别命名为 Dlurl、Dlname、DLpwd,用于输入服务器IP地址、用户名和密码。添加三个按钮,分别为下载文件、上传文件和保存帐号设置,并重新命名为:cmd_get、ucmd_send和
28、cmd_save。界面布局如图11-4所示。cmd_getcmd_sendDLurlDLnameDLpwdlbl_statecmd_save图11-4 界面布局u程序代码u1Dim Txt_ErrNum As Integeru2Dim state_info As Stringu3u4Private Sub Form_Load()u5 Txt_ErrNum=0u6 state_info=u7 lbl_state.Caption=就绪u8 u9 configFTPu10End Subu11u12Sub configFTP()u13 Inet1.URL=DLurl.Textu14 Inet1.Use
29、rName=DLname.Textu14 Inet1.Password=DLpwd.Textu15 Inet1.Protocol=icFTPu16 Inet1.RequestTimeout=60u17End Subu18u19Sub Down_Upload_file(flag As Integer)u20On Error Resume Nextu21 configFTPu22 u23 If flag=0 Thenu24 Inet1.Execute,get/A6.MP3 C:5.mp3u25 Elseu26 Inet1.Execute,send C:5.mp3/A61.MP3 u27 End I
30、fu28 u29 If Err.Number 0 Thenu30 MsgBox Err.Descriptionu31 GoTo endjumpu32 End Ifu33u34 While Val(Txt_ErrNum)12 等待下载结束 12u35 DoEventsu36 If Val(Txt_ErrNum)=11 Then 下载过程出现错误u37 GoTo endjumpu38 End Ifu39 Wendu40 u41 Inet1.Execute,close 关闭连接u42 Inet1.Execute,quit 退出服务器u43u44endjump:u45End Subu46u47Priv
31、ate Sub cmd_get_Click()u48 Down_Upload_file 0u49End Subu50u51Private Sub cmd_send_Click()u52 Down_Upload_file 1u53End Subu54u55Private Sub cmd_save_Click()u56 configFTPu57End Subu58u59Private Sub Inet1_StateChanged(ByVal State As Integer)u60 Txt_ErrNum=Stateu61 u62 Select Case Stateu63 Case 0:u64 st
32、ate_info=空状态!u65 Case 1:u66 state_info=正在查找服务器.!u67 Case 2:u70 state_info=找到服务器.!u71 Case 3:u72 state_info=准备连接服务器!u73 Case 4:u74 state_info=与服务器连接建立!u75 Case 5:u76 state_info=向服务器发出请求!u77 Case 6:u78 state_info=已经向服务器发出请求!u79 Case 7:u80 state_info=服务器收到请求!u81 Case 8:u82 state_info=服务器已经收到响应!正在传送.u83
33、 Case 9:u84 state_info=在断开连接.!u85 Case 10:u86 state_info=已经断开服务器!u87 Case 11:u88 state_info=发生通讯错误!&Inet1.ResponseInfou89 Case 12:u90 state_info=向服务器发出的请求结束!传送完毕!u91 End Selectu92 u93 lbl_state.Caption=state_infou94End Sub12.3 winsock 传输控件u11.3.1 winsock 传输控件概述u利用 WinSock 控件可以与远程计算机建立连接,并通过用户数据文报协议(
34、UDP)或者传输控制协议(TCP)进行数据交换。这两种协议都可以用来创建客户与服务器应用程序。与 Timer 控件类似,WinSock 控件在运行时是不可见的。u要使用Winsock控件,需要在菜单栏上选择“工程部件”选项,在“部件”对话框的“控件”选项卡中找到 项,添加到工程。添加后,在工具箱中将出现 图标。u1可能的用途u(1)创建收集用户信息的客户端应用程序,并将收集的信息发送到某中央服务器。u(2)创建一个服务器应用程序,作为多个用户的数据的汇入点。u(3)创建“聊天”应用程序。u选择通讯协议u使用 WinSock 控件时,首先需要考虑使用什么协议。可以使用的协议包括 TCP 和 UD
35、P。两种协议之间的重要区别在于它们的连接状态:u(1)TCP协议是基于连接的协议,可以将它与电话系统相比。开始数据传输之前,用户必须先建立连接。u(2)UDP协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。u具体选择哪一种协议,通常由需要创建的应用程序决定。下面的几个问题将有助于选择适宜的协议:u(1)收发数据时,应用程序是否需要得到客户端或服务器的确认信息?如果需要,使用 TCP 协议,在收发数据之前先建立明确的连接。u(2)数据量是否特别大(例如图象与声音文件)?建立连接后
36、,TCP 协议将维护连接并确保数据的完整性。不过,这种连接需要更多的计算资源,因而是比较“昂贵”的。u(3)数据发送是间歇的,还是在一个会话内?例如,如果应用程序在某个任务完成时需要通知某台计算机,UDP 协议更适宜。UDP 协议适合发送少量的数据。u协议的设置u设计时,可以按以下方式设置应用程序使用的协议:在“属性”窗口中单击“协议”,然后选择 sckTCPProtocol或者sckUDPProtocol。也可以用程序代码设置 Protocol 属性,如下所示:uWinsock1.Protocol=sckTCPProtocolu4.主要属性u(1)Protocol:返回或设置Winsock
37、控件使用的协议(TCP或UDP协议)。Protocol属性的设置值见表11-5。u表11-5 protocol属性的设置值常数值描述sckTCPProtocol0缺省的。TCP 协议。sckUDPProtocol1UDP 协议。u(2)RemoteHost:返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,如FTP:/;也可提供点格式下的IP 地址字符串,如“100.0.1.1”。u(3)RemoteHostIP:返回远程主机的IP地址。u若客户应用程序已用Connect方法建立连接,属性中包含了远程机器的 IP 字符串。对于服务器应用程序,请求连接(Connectio
38、nRequest 事件)后,属性包含远程计算机的 IP 地址字符串,该字符串启动了连接。使用UDP协议时,在DataArrival事件出现后,属性包含了发送UDP数据的计算机的IP地址。u(4)LocalHostName:返回本地计算机名。设计时是只读的,而且不可用。u(5)LocalIP:返回本地计算机的IP地址,格式是IP 地址加点字符串(xxx.xxx.xxx.xxx)。设计时是只读的,而且不可用。u(6)LocalPort:返回或者设置所用的本地端口。设计时是可读/写的,而且可用。u对客户来说,该属性指定发送数据的本地端口。如果应用程序不需要特定端口,则指定 0 为端口号。这种情况下,
39、控件将选择一个随机端口。建立起连接后,该端口是用于 TCP 连接的本地端口。u对于服务器来说,是用于侦听的本地端口。如果指定端口0,就使用一个随机端口。调用 Listen方法后,属性包含了已选定的实际端口。u(7)BytesReceived:返回接收到的(当前在接收端缓冲区内的)数据的数量。使用 GetData 方法获取数据。设计时是只读的,而且不可用。u(8)State:返回控件的状态,用枚举类型表示。设计时是只读的,而且不可用。State 属性的设置值见表11-6。常数值描述sckClosed0缺省的。关闭sckOpen1打开sckListening2侦听sckConnectionPend
40、ing 3连接挂起sckResolvingHost 4识别主机sckHostResolved 5已识别主机sckConnecting 6正在连接sckConnected 7已连接sckClosing 8同级人员正在关闭连接sckError 9错误表11-6 State 属性的设置值u5.主要方法u(1)Connect 方法:要求连接到远程计算机。u说明:想建立 TCP 连接时,必须调用 Connect 方法。u语法:Connect remoteHost,remotePortu返回值:无u语法说明见表11-7。部分描述remoteHost必需的。要连接的远程计算机的名称。remotePort要连
41、接的远程计算机的端口。u(2)Accept 方法:仅适用于 TCP 服务器应用程序。处理 ConnectionRequest 事件时用这个方法接受新连接。u语法:Accept requestedu返回值:无u说明:在ConnectionRequest事件中使用 Accept 方法。ConnectionRequest 事件有一个对应的参数,即 RequestID 参数,该参数应该传给 Accept 方法。例如:uPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)u 测试 State 属性,如果当前连接是打开的话,则关闭连
42、接。u If Winsock1.State sckClosed Then Winsock1.Closeu 将 requestID 参数值传递给 Accept 方法。u Winsock1.Accept requesteduEnd Subu(3)Listen 方法:创建套接字并将其设置为侦听模式。该方法仅适用于 TCP 连接。u语法:Listenu返回值:无u说明:当有新连接时,就会出现 ConnectionRequest 事件。处理 ConnectionRequest 事件时,应用程序应该(在一个新的控件示例上)用 Accept 方法接受连接。u(4)GetData 方法:获取当前的数据块并将其
43、存储在变体类型的变量中。u语法:GetData data,type,maxLenu语法说明见表11-8。u表11-8 GetData方法的语法说明部分描述 Data在方法成功返回之后存储获取数据的地方。如果对请求的类型没有足够可用的数据,则将 data 设置成 Empty。Type可选的。获取的数据类型,如下例“设置值”所示。maxLen可选的。在接收到字节数组或字符串时所需大小。如果对字节数组或字符串、参数丢失、则将获取所有可用数据。如果提供的数据类型不是字节数组或字符串,则忽略这个参数。utype 的设置值见表11-9。u表11-9 type 的设置值描述常数BytevbByteInteg
44、ervbIntegerLongvbLong描述常数SinglevbSingleDoublevbDoubleCurrencyvbCurrencyDatevbDateBooleanvbBooleanSCODEvbErrorStringvbStringByte ArrayvbArray+vbByteu说明:通常将GetData方法与DataArrival事件并用,而DataArrival事件包含 totalBytes 参数。如果指定一个比totalBytes参数小的maxlen,则将得到警告10040,指出剩余的字节将丢失。u(5)Bind 方法:指定用于TCP连接的 LocalPort 和 Loc
45、alIP。如果有多协议适配卡,就用这个方法。u语法:语法:Bind LocalPort,LocalIPuBind 方法的语法说明见表11-10。u表11-10 Bind 方法的语法说明部分描述LocalPort用来建立连接的端口。LocalIP用来建立连接的本地 Internet 地址。说明:调用 Listen 方法之前,必须调用 Bind 方法。u6.主要事件u(1)Connect 事件:当一个 Connect 操作完成时发生。u说明:使用 Connect 事件确认已经成功建立了一个连接。u(2)ConnectionRequest事件:当远程计算机请求连接时出现。u说明:仅适用于TCP服务器
46、应用程序。请求一个新连接时激活该事件。激活该事件后,RemoteHostIP和RemotePort 属性存储有关客户的信息;服务器可决定是否接受连接。如果不接受新连接,则同级人员(客户)将得到 Close 事件。(在一个新控件示例上)用 Accept 方法接受新连接。u(3)DataArrival 事件:当新数据到达时出现。u说明:如果没有获取一个GetData调用中的全部数据,则事件不会出现。只有存在新数据时才激活该事件。可随时用BytesReceived属性检查可用的数据量。u(4)SendComplete事件:完成一个发送操作时出现。u(5)Error 事件:无论何时,只要后台处理中出现
47、错误(例如连接失败,或在后台收发数据失败),事件就会出现。u(6)Close 事件:当远程计算机关闭连接时出现。应用程序应正确使用Close方法关闭 TCP连接。11.3.2 TCP 连接初步u例11-4 创建一个简单的TCP服务器和客户端。u分析u如果应用程序要使用 TCP 协议,首先必须决定应用程序是服务器还是客户端。如果要创建一个服务器端,则应用程序需要“监听”指定的端口。当客户端提出连接请求时,服务器端能够接受请求并建立连接。连接建立后,客户端与服务器端可以自由地互相通讯。u1.创建TCP服务器u建立工程u创建新的 Standard EXE 工程。将默认窗体的名称改为 frmServe
48、r。将窗体的标题改为“TCP 服务器”。在窗体中放入一个 Winsock 控件,将其名字改为 tcpServer。u在窗体上添加两个 TextBox 控件,第一个命名为 txtSendData,第二个命名txtOutput。u程序代码u为窗体添加如下的代码。uPrivate Sub Form_Load()u将 LocalPort 属性设置为一个整数。u然后调用 Listen 方法。utcpServer.LocalPort=1001utcpServer.Listen ufrmClient.Show 显示客户端的窗体。uEnd SubuPrivate Sub tcpServer_Connectio
49、nRequest _u(ByVal requestID As Long)u检查控件的 State 属性是否为关闭的。u如果不是,u在接受新的连接之前先关闭此连接。uIf tcpServer.State sckClosed Then _utcpServer.Closeu接受具有 requestID 参数的u连接。utcpServer.Accept requestIDuEnd SubuPrivate Sub txtSendData_Change()u名为 txtSendData 的 TextBox 控件中u包含了要发送的数据。当用户往文本框中u键入数据时,使用 SendData 方法u发送输入的字
50、符串。utcpServer.SendData txtSendData.TextuEnd SubuPrivate Sub tcpServer_DataArrival _u(ByVal bytesTotal As Long)u为进入的数据声明一个变量。u调用 GetData 方法,并将数据赋予名为 txtOutput u的 TextBox 的 Text 属性。uDim strData As StringutcpServer.GetData strDatautxtOutput.Text=strDatauEnd Subu说明:以上步骤创建了一个简单的服务器应用程序。为了使它能够工作,还必须为它创建一个