版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多媒体与网络第1页,课件共62页,创作于2023年2月第11章多媒体与网络第2页,课件共62页,创作于2023年2月11.1.1媒体播放器概述
1.媒体播放器
MultimediaMCI控件管理媒体控制接口(MCI)设备上多媒体文件的录制与回放。实际上,这种控件是一组按钮,用来向诸如声卡、MIDI序列发生器、CD-ROM驱动器、视频CD播放器、视频磁带记录器及播放器等设备发出MCI命令。MCI控件还支持Windows(*.avi)视频文件的回放。要在VB工程中使用MultimediaMCI控件,需要在菜单上选择“工程→部件”选项,在“部件”对话框的“控件”选项卡中找到项,添加到工程中。添加后,在工具箱中将出现图标。设计时,将MultimediaMCI控件添加到一个窗体上,如图11-1所示图11-1MultimediaMCI控件添加到窗体上第3页,课件共62页,创作于2023年2月将按钮分别定义为Prev(上一首)、Next(下一首)、Play(播放)、Pause(暂停)、Back(后退)、Step(步进)、Stop(停止)、Record(录音)和Eject(弹出)。需要使用或显示某几个按钮时,可以将其中的按钮属性Visible和Enabled设置为True;否则,设置其属性值为false。第4页,课件共62页,创作于2023年2月2.主要属性(1)Command属性:指定将要执行的MCI
命令。语法:Command[=cmdstring$]说明:参数cmdstring$给出了将要执行的MCI命令的名称:Open、Close、Play、Pause、Stop、Back、Step、Prev、Next、Seek、Record、Eject、Sound或Save。这些命令被立即执行,并将错误代码存放在Error属性中。表11-1描述了所有的命令及其使用的属性。如果没有对某个属性进行设置,它既可以使用默认值(给出在属性名后的括号中),也有可能不使用该属性(没有列出默认值)。命令描述/所用的属性Open使用MCI_OPEN命令打开一设备。Notify(False)Wait(True)SharableDeviceTypeFileNameClose使用MCI_CLOSE命令关闭一设备。第5页,课件共62页,创作于2023年2月续表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第6页,课件共62页,创作于2023年2月续表Step使用MCI_STEP命令向前单步。Notify(False)Wait(True)FramesPrev使用Seek命令定位到当前曲目的开始部分。如果在上一次Prev命令之后三秒之内再次执行这一命令,那么就定位到上一个曲目的开始部分,如果已经处在第一个曲目内,那么就只是定位到第一个曲目的开始部分。第7页,课件共62页,创作于2023年2月命令描述/所用的属性Notify(False)Wait(True)Next使用Seek命令定位到下一个曲目的开始部分(如果已经处在最后一个曲目内,那么就定位到最后一个曲目的开始部分)。Notify(False)Wait(True)Seek如果没有进行播放,那么就使用MCI_SEEK命令搜索一个位置。如果播放正在进行,那么就使用MCI_PLAY命令从给定位置开始继续播放。Notify(False)Wait(True)ToRecord使用MCI_RECORD命令进行记录。续表第8页,课件共62页,创作于2023年2月Notify(True)Wait(False)FromToRecordmode(0–Insert)Eject使用MCI_SET命令将媒体弹出。Notify(False)Wait(True)Sound使用MCI_SOUND命令播放声音。Notify(False)Wait(False)FileNameSave使用MCI_SAVE命令保存打开的文件。Notify(False)Wait(True)FileName续表第9页,课件共62页,创作于2023年2月其中:1)DeviceType属性:指定要打开的MCI设备的类型。语法:DeviceType[=device$]
说明:参数device$是要打开的MCI设备的类型,例如:AVIVideo、CDAudio、DAT、DigitalVideo、MMMovie、其它、Overlay、扫描仪、序列发生器、VCR、视盘或WaveAudio。打开简单设备(如不使用文件的音频CD)时,该属性必须设置。如果文件的扩展名没有指定将要使用的设备,打开复杂MCI设备时也必须设置该属性。2)Wait属性:决定MultimediaMCI控件是否要等到下一条MCI命令完成,才能将控件返回应用程序。在设计时,该属性不可用。对该属性赋值时,只对下一条MCI命令有效。后面的MCI命令会一直忽略Wait属性,除非用另外一个值(不同的或可标识的)为它赋值。第10页,课件共62页,创作于2023年2月3)Sharable属性:决定多个程序能否共享同一台MCI设备。若取值为False,表示其它控件或应用程序不能访问这台设备;若取值为True,表示多个控件或应用程序能够打开这台设备。4)Notify属性:决定下一条MCI命令是否使用MCI通知服务。如果被设置为True,则Notify属性在下一条MCI命令完成时产生一个回调事件(Done)。设计时该属性不可用。(2)UpdateInterval属性:规定两次连续的StatusUpdate事件之间的毫秒数。语法:UpdateInterval[=milliseconds%]
说明:参数milliseconds%规定事件之间的毫秒数。如果毫秒数是0,表明没有StatusUpdate事件发生。第11页,课件共62页,创作于2023年2月3.主要事件(1)StatusUpdate事件(MultimediaMCI控件):按UpdateInterval属性给定的时间间隔自动地发生。语法:PrivateSubMMControl_StatusUpdate()
说明:该事件允许应用程序更新显示,以通知用户当前MCI设备的状态。应用程序可以从Position、Length和Mode等属性中获得状态信息。(2)Done事件:当Notify
属性为True的MCI
命令结束时发生。语法:PrivateSubMMControl_Done(NotifyCodeAsInteger)
说明:参数NotifyCode表示MCI命令是否成功。可以是表11-2中的任意设置值。第12页,课件共62页,创作于2023年2月表11-2参数NotifyCode的设置值值设置值/Result1mciSuccessful命令成功的执行。2mciSuperseded命令被其它命令所替代。4mciAborted命令被用户中断。8mciFailure命令失败。第13页,课件共62页,创作于2023年2月11.1.2简单媒体播放器
[例11-1]制作播放WAVMP3mid等音频文件的播放器。[分析]播放文件一般步骤:设置设备打开的属性;指定播放文件;打开设备,开始播放;播放完毕,关闭设备。[建立工程]新建窗体,命名为frmWAV。向窗体添加一个MCI控件,一个通用对话框控件,四个按钮,五个label控件,一个文本框控件,界面布局如图11-2所示。Text1cmdOpenCommonDialog1MMControl1cmdPlaycmdPausecmdCloseLabel2
Label3图11-2界面布局第14页,课件共62页,创作于2023年2月[程序代码]’打开文件按钮代码PrivateSubcmdOpen_Click()'未打开文件前,让播放\暂停\关闭按钮不可用
cmdPlay.Enabled=FalsecmdPause.Enabled=FalsecmdClose.Enabled=False'选择文件对话框
CommonDialog1.DialogTitle="选择播放文件"CommonDialog1.Filter="*.wav|*.wav|*.mid|*.mid|*.mp3|*.mp3"CommonDialog1.FileName=""CommonDialog1.ShowOpen
'如果选择了文件,则设置MCI属性
IfCommonDialog1.FileName<>""ThenText1.Text=CommonDialog1.FileName第15页,课件共62页,创作于2023年2月
'打开文件前,先停止上一次的播放
MMControl1.Command="close"
MMControl1.FileName=Text1.TextMMControl1.DeviceType=""MMControl1.Command="open"
'显示文件播放长度
Label2.Caption=ToHMS(MMControl1.Length)
'出发StatusUpdate事件,在该事件中,得到当前播放进度
MMControl1.UpdateInterval=100
cmdPlay.Enabled=TrueEndIfEndSub'开始播放PrivateSubcmdPlay_Click()MMControl1.Command="play"cmdPlay.Enabled=FalsecmdPause.Enabled=TruecmdClose.Enabled=TrueEndSub第16页,课件共62页,创作于2023年2月'暂停播放PrivateSubcmdPause_Click()MMControl1.Command="pause"
cmdPlay.Enabled=TruecmdPause.Enabled=FalsecmdClose.Enabled=TrueEndSub'停止播放PrivateSubcmdClose_Click()MMControl1.Command="close"
cmdPlay.Enabled=FalsecmdPause.Enabled=FalsecmdClose.Enabled=FalseEndSub'显示播放进度PrivateSubMMControl1_StatusUpdate()Label3.Caption=ToHMS(MMControl1.Position)第17页,课件共62页,创作于2023年2月'播放完毕,循环播放
IfMMControl1.Position>=MMControl1.LengthThenMMControl1.Command="prev"MMControl1.Command="play"EndIfEndSub'转换为时分秒格式FunctionToHMS(TsAsLong)AsStringTs=Ts/1000hh=Ts\3600mm=(TsMod3600)\60ss=(TsMod3600)Mod60
ToHMS=Format(hh,"00")&";"&Format(mm,"00")&";"&Format(ss,"00")EndFunction第18页,课件共62页,创作于2023年2月[运行结果]单击“打开文件”按钮,选择MAVMID或MP3文件后,“播放”按钮可用;单击“播放”按钮,label3将显示播放进度;控制“暂停”或“停止”按钮,实现相应的操作。显示效果如图11-3所示。一般情况下,如果要使用自定义按钮代替MCI操作按钮,MCI控件应将Visible属性设置为false,让其不可见。图11-3播放器运行结果第19页,课件共62页,创作于2023年2月11.1.3录音与放音
[例11-2]通过电脑麦克风录制声音文件,保存到本机,并回放该文件。[分析]录制文件的一般步骤如下:设置设备打开的属性;指定录制文件保存的位置;打开设备,开始录制;录制完毕,保存文件;关闭设备。使用MultimediaMCI控件记录音频信号之前,应打开一个新的文件,以保证记录声音的数据文件格式与系统记录格式完全兼容。关闭MCI设备前,应该发出MCISave命令,把记录的数据保存到文件中去。第20页,课件共62页,创作于2023年2月[建立工程]添加窗体frmRec,向窗体添加MCI控件及四个按钮控件,分别命名为cmdRec、cmdPause、cmdSave和cmdPlay,如图11-4所示。[程序代码]'开始录音PrivateSubcmdRec_Click()MMControl1.Wait=TrueMMControl1.DeviceType="WaveAudio"MMControl1.FileName="c:\myRec.wav"'必须先设置文件名
MMControl1.Command="open"MMControl1.Command="Record"EndSub'暂停和继续录音PrivateSubcmdPause_Click()IfcmdPause.Caption="暂停录音"ThencmdPause.Caption="继续录音"MMControl1.Command="pause"ElsecmdPause.Caption="暂停录音"MMControl1.Command="Record"EndIfEndSub第21页,课件共62页,创作于2023年2月'保存录制的文件PrivateSubcmdSave_Click()MMControl1.Command="Save"MMControl1.Command="Close"EndSub'回放录音文件PrivateSubcmdPlay_Click()MMControl1.Wait=TrueMMControl1.DeviceType="WaveAudio"MMControl1.FileName="c:\myRec.wav"MMControl1.Command="open"MMControl1.Command="play"EndSubcmdReccmdPausecmdSavecmdPlayMMControl1图11-4界面布局
[运行结果]如图11-5所示。第22页,课件共62页,创作于2023年2月[运行结果]如图11-5所示。图11-5运行结果。为代码简单起见,未对按钮之间的操作逻辑进行控制。请读者完善例11-2第23页,课件共62页,创作于2023年2月11.2Internet传输控件
1.Internet传输控件InternetTransfer控件(以下简称称inet控件)支持超文本传输协议(HTTP)和文件传输协议(FTP),它们是Internet网上使用最广泛的两种协议。使用HTTP协议可以连接全球信息网(WorldWideWeb)服务器,以检索HTML文档。使用FTP协议可以在FTP服务器上登录,以下载和加载文件。UserName和Password属性可让用户在要求验证身份的私有服务器上登录。另外,也可以连接公用的FTP服务器,并下载文件。Execute方法支持普通的FTP命令,如CD和GET。要使用inet控件,需要在菜单栏上选择“工程→部件”选项,在“部件”对话框的“控件”选项卡中找到项,添加到工程中。添加后,在工具箱中将出现图标。第24页,课件共62页,创作于2023年2月2.主要属性(1)URL属性:设置或返回Execute或OpenURL方法使用的URL。URL属性至少必须包含一个协议(FTP或HTTP)和一个远程主机名。URL属性可以是目录或文件。例如,下面两个URLs都是有效的:'设置URL,仅返回文件目录:Inet1.URL="HTTP://"'该URL将返回文件的文本:Inet1.URL=HTTP:///disclaimer.txt(2)RequestTimeout属性:设置或返回超时截止前按秒计算的等待时间长度。如果请求在指定的时间内还没有响应,并且该请求使用OpenURL方法(同步地),将产生错误;如果请求使用Execute方法,将引发带错误码的StateChanged事件。把该属性设置为0,则意味着不限定等待时间。(3)Protocol属性:设置或返回一个值,指定和Execute方法一起使用的协议。第25页,课件共62页,创作于2023年2月表11-3Protocol的有效设置值常数值描述icUnknown0未知的。icDefault1缺省协议。icFTP2FTP。文件传输协议。icReserved3为将来预留。icHTTP4HTTP。超文本传输协议。icHTTPS5安全HTTP。第26页,课件共62页,创作于2023年2月(4)UserName属性:设置或返回与请求一起发送到远程计算机的名称。如果该属性为空,提出请求时该控件将把“anonymous”作为用户名来发送。(5)Password属性:设置或返回一个密码,该密码将和请求一道被发送,用以在远程计算机上登录。如果该属性为空,控件将发送一个缺省的密码。第27页,课件共62页,创作于2023年2月3.主要方法(1)Execute方法作用:执行对远程服务器的请求。只能发送对特定的协议有效的请求。语法格式:Executeurl,operation,data,requestHeadersExecute属性的语法包含以下部分:url:可选,字符串,指定控件将要连接的URL。如果这里未指定URL,将使用URL属性中指定的URL。Operation:可选,字符串,指定将要执行的操作类型。支持的操作列表参见下面的“设置值”。Data:可选,字符串,指定用于操作的数据(参见下面的“设置值”)。requestHeaders:可选,字符串,指定由远程服务器传来的附加的标头。格式:headername:headervaluevbCrLf第28页,课件共62页,创作于2023年2月(2)OpenURL方法打开并返回指定URL的文档,文档以变体型返回。语法格式:OpenUrlurl[,datatype]其中:url:必需的,被检索文档的URL。Datatype:可选,整数,如“设置值”所示,指定数据类型。Datatype的设置值:icString0:缺省值,把数据作为字符串来检索。icByteArray1:把数据作为字节数组来检索。4.主要事件Inet控件只有一个事件:StateChanged事件。该事件在连接中状态发生改变时触发。事件格式:tateChanged(ByValStateAsInteger)其中,State为整数,取值见表11-4的“设置值”,用于指定状态。第29页,课件共62页,创作于2023年2月表11-4State的设置值常数值描述icNone0无状态可报告。icHostResolvingHost1该控件正在查询所指定的主机的IP地址。icHostResolved2该控件已成功地找到所指定的主机的IP地址。icConnecting3该控件正在与主机连接。icConnected4该控件已与主机连接成功。icRequesting5该控件正在向主机发送请求。icRequestSent6该控件发送请求已成功。icReceivingResponse7该控件正在接收主机的响应。icResponseReceived8该控件已成功地接收到主机的响应。icDisconnecting9该控件正在解除与主机的连接。icDisconnected10该控件已成功地与主机解除了连接。icError11与主机通讯时出现了错误。icResponseCompleted12该请求已经完成,并且所有数据均已接收到。第30页,课件共62页,创作于2023年2月使用inet控件的一般思路:设置URL属性,指定登录的服务器;如果登录的是FTP服务器,需要指定用户名和密码,可以匿名登录的FTP服务器无需设置其UserName和Password属性。然后通过Execute方法传递get命令参数下载文件;传递send命令参数上传文件.第31页,课件共62页,创作于2023年2月11.2.2利用控件上传下载文件
[例11-3][分析]要正确运行本例,需要在本地建立FTP服务器,在FTP服务器中存放有A6.MP3文件或其它任意文件。此外,也可以指定任意一个实际存在的FTP服务器,输入用户名和密码进行下载和上传文件。[建立工程]添加三个文本框,分别命名为Dlurl、Dlname、DLpwd,用于输入服务器IP地址、用户名和密码。添加三个按钮,分别为下载文件、上传文件和保存帐号设置,并重新命名为:cmd_get、cmd_send和cmd_save。界面布局如图11-4所示。第32页,课件共62页,创作于2023年2月cmd_getcmd_sendDLurlDLnameDLpwdlbl_statecmd_save图11-4界面布局第33页,课件共62页,创作于2023年2月[程序代码]1 DimTxt_ErrNumAsInteger2 Dimstate_infoAsString3 4 PrivateSubForm_Load()5 Txt_ErrNum=06 state_info=""7 lbl_state.Caption="就绪"8 9 configFTP10 EndSub11 12 SubconfigFTP()13 Inet1.URL=DLurl.Text14 Inet1.UserName=DLname.Text14 Inet1.Password=DLpwd.Text15 Inet1.Protocol=icFTP16 Inet1.RequestTimeout=6017 EndSub18 19 SubDown_Upload_file(flagAsInteger)20 OnErrorResumeNext第34页,课件共62页,创作于2023年2月21 configFTP22 23 Ifflag=0Then24 Inet1.Execute"","get/A6.MP3C:\5.mp3"25 Else26 Inet1.Execute"","sendC:\5.mp3/A61.MP3"27 EndIf28 29 IfErr.Number>0Then30 MsgBoxErr.Description31 GoToendjump32 EndIf33 34 WhileVal(Txt_ErrNum)<>12'等待下载结束<>1235 DoEvents36 IfVal(Txt_ErrNum)=11Then'下载过程出现错误37 GoToendjump38 EndIf39 Wend40 41 Inet1.Execute,"close"'关闭连接第35页,课件共62页,创作于2023年2月42 Inet1.Execute,"quit"'退出服务器43 44 endjump:45 EndSub46 47 PrivateSubcmd_get_Click()48 Down_Upload_file049 EndSub50 51 PrivateSubcmd_send_Click()52 Down_Upload_file153 EndSub54 55 PrivateSubcmd_save_Click()56 configFTP57 EndSub58 59 PrivateSubInet1_StateChanged(ByValStateAsInteger)60 Txt_ErrNum=State61 62 SelectCaseState63 Case0:64 state_info="空状态!"65 Case1:66 state_info="正在查找服务器...!"第36页,课件共62页,创作于2023年2月67 Case2:70 state_info="找到服务器...!"71 Case3:72 state_info="准备连接服务器!"73 Case4:74 state_info="与服务器连接建立!"75 Case5:76 state_info="向服务器发出请求!"77 Case6:78 state_info="已经向服务器发出请求!"79 Case7:80 state_info="服务器收到请求!"81 Case8:82 state_info="服务器已经收到响应!正在传送...."83 Case9:84 state_info="在断开连接....!"85 Case10:86 state_info="已经断开服务器!"87 Case11:88 state_info="发生通讯错误!"&Inet1.ResponseInfo89 Case12:90 state_info="向服务器发出的请求结束!传送完毕!"91 EndSelect92 93 lbl_state.Caption=state_info94 EndSub第37页,课件共62页,创作于2023年2月12.3winsock传输控件
11.3.1winsock传输控件概述利用WinSock控件可以与远程计算机建立连接,并通过用户数据文报协议(UDP)或者传输控制协议(TCP)进行数据交换。这两种协议都可以用来创建客户与服务器应用程序。与Timer控件类似,WinSock控件在运行时是不可见的。要使用Winsock控件,需要在菜单栏上选择“工程→部件”选项,在“部件”对话框的“控件”选项卡中找到项,添加到工程。添加后,在工具箱中将出现图标。第38页,课件共62页,创作于2023年2月1.可能的用途(1)创建收集用户信息的客户端应用程序,并将收集的信息发送到某中央服务器。(2)创建一个服务器应用程序,作为多个用户的数据的汇入点。(3)创建“聊天”应用程序。2.选择通讯协议使用WinSock控件时,首先需要考虑使用什么协议。可以使用的协议包括TCP和UDP。两种协议之间的重要区别在于它们的连接状态:(1)TCP协议是基于连接的协议,可以将它与电话系统相比。开始数据传输之前,用户必须先建立连接。(2)UDP协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。具体选择哪一种协议,通常由需要创建的应用程序决定。下面的几个问题将有助于选择适宜的协议:(1)收发数据时,应用程序是否需要得到客户端或服务器的确认信息?如果需要,使用TCP协议,在收发数据之前先建立明确的连接。第39页,课件共62页,创作于2023年2月(2)数据量是否特别大(例如图象与声音文件)?建立连接后,TCP协议将维护连接并确保数据的完整性。不过,这种连接需要更多的计算资源,因而是比较“昂贵”的。(3)数据发送是间歇的,还是在一个会话内?例如,如果应用程序在某个任务完成时需要通知某台计算机,UDP协议更适宜。UDP协议适合发送少量的数据。3.协议的设置设计时,可以按以下方式设置应用程序使用的协议:在“属性”窗口中单击“协议”,然后选择sckTCPProtocol或者sckUDPProtocol。也可以用程序代码设置Protocol属性,如下所示:Winsock1.Protocol=sckTCPProtocol第40页,课件共62页,创作于2023年2月4.主要属性(1)Protocol:返回或设置Winsock控件使用的协议(TCP或UDP协议)。Protocol属性的设置值见表11-5。表11-5protocol属性的设置值常数值描述sckTCPProtocol0缺省的。TCP协议。sckUDPProtocol1UDP协议。第41页,课件共62页,创作于2023年2月(2)RemoteHost:返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主机名,如FTP://;也可提供点格式下的IP地址字符串,如“”。(3)RemoteHostIP:返回远程主机的IP地址。若客户应用程序已用Connect方法建立连接,属性中包含了远程机器的IP字符串。对于服务器应用程序,请求连接(ConnectionRequest事件)后,属性包含远程计算机的IP地址字符串,该字符串启动了连接。使用UDP协议时,在DataArrival事件出现后,属性包含了发送UDP数据的计算机的IP地址。(4)LocalHostName:返回本地计算机名。设计时是只读的,而且不可用。(5)LocalIP:返回本地计算机的IP地址,格式是IP地址加点字符串(xxx.xxx.xxx.xxx)。设计时是只读的,而且不可用。第42页,课件共62页,创作于2023年2月(6)LocalPort:返回或者设置所用的本地端口。设计时是可读/写的,而且可用。对客户来说,该属性指定发送数据的本地端口。如果应用程序不需要特定端口,则指定0为端口号。这种情况下,控件将选择一个随机端口。建立起连接后,该端口是用于TCP连接的本地端口。对于服务器来说,是用于侦听的本地端口。如果指定端口0,就使用一个随机端口。调用Listen方法后,属性包含了已选定的实际端口。(7)BytesReceived:返回接收到的(当前在接收端缓冲区内的)数据的数量。使用GetData方法获取数据。设计时是只读的,而且不可用。(8)State:返回控件的状态,用枚举类型表示。设计时是只读的,而且不可用。State属性的设置值见表11-6。第43页,课件共62页,创作于2023年2月常数值描述sckClosed0缺省的。关闭sckOpen1打开sckListening2侦听sckConnectionPending3连接挂起sckResolvingHost4识别主机sckHostResolved5已识别主机sckConnecting6正在连接sckConnected7已连接sckClosing8同级人员正在关闭连接sckError9错误表11-6State属性的设置值第44页,课件共62页,创作于2023年2月5.主要方法(1)Connect方法:要求连接到远程计算机。说明:想建立TCP连接时,必须调用Connect方法。语法:ConnectremoteHost,remotePort返回值:无语法说明见表11-7。部分描述remoteHost必需的。要连接的远程计算机的名称。remotePort要连接的远程计算机的端口。第45页,课件共62页,创作于2023年2月(2)Accept方法:仅适用于TCP服务器应用程序。处理ConnectionRequest事件时用这个方法接受新连接。语法:Acceptrequested返回值:无说明:在ConnectionRequest事件中使用Accept方法。ConnectionRequest事件有一个对应的参数,即RequestID参数,该参数应该传给Accept方法。例如:PrivateSubWinsock1_ConnectionRequest(ByValrequestIDAsLong)'测试State属性,如果当前连接是打开的话,则关闭连接。
IfWinsock1.State<>sckClosedThenWinsock1.Close'将requestID参数值传递给Accept方法。
Winsock1.AcceptrequestedEndSub(3)Listen方法:创建套接字并将其设置为侦听模式。该方法仅适用于TCP连接。语法:Listen返回值:无说明:当有新连接时,就会出现ConnectionRequest事件。处理ConnectionRequest事件时,应用程序应该(在一个新的控件示例上)用Accept方法接受连接。第46页,课件共62页,创作于2023年2月(4)GetData方法:获取当前的数据块并将其存储在变体类型的变量中。语法:GetDatadata,[type,][maxLen]语法说明见表11-8。表11-8GetData方法的语法说明部分描述Data在方法成功返回之后存储获取数据的地方。如果对请求的类型没有足够可用的数据,则将data设置成Empty。Type可选的。获取的数据类型,如下例“设置值”所示。maxLen可选的。在接收到字节数组或字符串时所需大小。如果对字节数组或字符串、参数丢失、则将获取所有可用数据。如果提供的数据类型不是字节数组或字符串,则忽略这个参数。第47页,课件共62页,创作于2023年2月type
的设置值见表11-9。表11-9type
的设置值描述常数BytevbByteIntegervbIntegerLongvbLong描述常数SinglevbSingleDoublevbDoubleCurrencyvbCurrencyDatevbDateBooleanvbBooleanSCODEvbErrorStringvbStringByteArrayvbArray+vbByte第48页,课件共62页,创作于2023年2月说明:通常将GetData方法与DataArrival事件并用,而DataArrival事件包含totalBytes参数。如果指定一个比totalBytes参数小的maxlen,则将得到警告10040,指出剩余的字节将丢失。(5)Bind方法:指定用于TCP连接的LocalPort和LocalIP。如果有多协议适配卡,就用这个方法。语法:Bind
LocalPort,LocalIPBind方法的语法说明见表11-10。表11-10Bind方法的语法说明部分描述LocalPort用来建立连接的端口。LocalIP用来建立连接的本地Internet地址。说明:调用Listen方法之前,必须调用Bind方法。第49页,课件共62页,创作于2023年2月6.主要事件(1)Connect事件:当一个Connect操作完成时发生。说明:使用Connect事件确认已经成功建立了一个连接。(2)ConnectionRequest事件:当远程计算机请求连接时出现。说明:仅适用于TCP服务器应用程序。请求一个新连接时激活该事件。激活该事件后,RemoteHostIP和RemotePort属性存储有关客户的信息;服务器可决定是否接受连接。如果不接受新连接,则同级人员(客户)将得到Close事件。(在一个新控件示例上)用Accept方法接受新连接。(3)DataArrival事件:当新数据到达时出现。说明:如果没有获取一个GetData调用中的全部数据,则事件不会出现。只有存在新数据时才激活该事件。可随时用BytesReceived属性检查可用的数据量。(4)SendComplete事件:完成一个发送操作时出现。(5)Error事件:无论何时,只要后台处理中出现错误(例如连接失败,或在后台收发数据失败),事件就会出现。(6)Close事件:当远程计算机关闭连接时出现。应用程序应正确使用Close方法关闭TCP连接。第50页,课件共62页,创作于2023年2月11.3.2TCP连接初步
[例11-4]创建一个简单的TCP服务器和客户端。[分析]如果应用程序要使用TCP协议,首先必须决定应用程序是服务器还是客户端。如果要创建一个服务器端,则应用程序需要“监听”指定的端口。当客户端提出连接请求时,服务器端能够接受请求并建立连接。连接建立后,客户端与服务器端可以自由地互相通讯。第51页,课件共62页,创作于2023年2月1.创建TCP服务器[建立工程]创建新的StandardEXE工程。将默认窗体的名称改为frmServer。将窗体的标题改为“TCP服务器”。在窗体中放入一个Winsock控件,将其名字改为tcpServer。在窗体上添加两个TextBox控件,第一个命名为txtSendData,第二个命名txtOutput。[程序代码]为窗体添加如下的代码。PrivateSubForm_Load()'将LocalPort属性设置为一个整数。'然后调用Listen方法。tcpServer.LocalPort=1001tcpServer.ListenfrmClient.Show'显示客户端的窗体。EndSubPrivateSubtcpServer_ConnectionRequest_(ByValrequestIDAsLong)第52页,课件共62页,创作于2023年2月'检查控件的State属性是否为关闭的。'如果不是,'在接受新的连接之前先关闭此连接。IftcpServer.State<>sckClosedThen_tcpServer.Close'接受具有requestID参数的'连接。tcpServer.AcceptrequestIDEndSubPrivateSubtxtSendData_Change()'名为txtSendData的TextBox控件中'包含了要发送的数据。当用户往文本框中'键入数据时,使用SendData方法'发送输入的字符串。tcpServer.SendDatatxtSendData.TextEndSubPrivateSubtcpServer_DataArrival_(ByValbytesTotalAsLong)第53页,课件共62页,创作于2023年2月'为进入的数据声明一个变量。'调用GetData方法,并将数据赋予名为txtOutput'的TextBox的Text属性。DimstrDataAsStringtcpServer.GetDatastrDatatxtOutput.Text=strDataEndSub说明:以上步骤创建了一个简单的服务器应用程序。为了使它能够工作,还必须为它创建一个客户端的应用程序。第54页,课件共62页,创作于2023年2月2.创建TCP客户端[建立工程]在工程中添加一个新的窗体,将其命名为frmClient。将窗体的标题改为“TCPClient”。在窗体中添加一个Winsock控件,并将其命名为tcpClient。在frmClient中添加两个TextBox控件。将第一个命名为txtSend,第二个为txtOutput。在窗体上放一个CommandButton控件,并将其命名为cmdConnect。将CommandButton控件的标题改为Connect。[程序代码]在窗体中添加如下的代码。第55页,课件共62页,创作于2023年2月注意:必须将RemoteHost属性值修改为计算机名。PrivateSubForm_Load()'Winsock控件的名字为tcpClient。
'注意:要指定远程主机,可以使用
'IP地址(例如:""),也可以使用
'计算机的“好听的名字”如下所示。
tcpClient.RemoteHost="RemoteComputerName"tcpClient.RemotePort=1001EndSubPrivateSubcmdConnect_Click()'调用Connect方法,初始化连接。
tcpClient.ConnectEndSubPrivateSubtxtSendData_Change()tcpClient.SendDatatxtSend.TextEndSubPrivateSubtcpClient_DataArrival_(ByValbytesTotalAsLong)DimstrDataAsStringtcpClient.GetDatastrDatatxtOutput.Te
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版电子商务数据安全处理合同范本解析3篇
- 2024版智能家居设备销售代理及市场推广协议3篇
- 2024年度腾讯公司泰康协议存款合同规范本3篇
- 2024版房屋预约买卖合同(含房屋买卖合同终止条件)3篇
- 2024版智慧城市项目设计与实施合作协议3篇
- 2024版房地产项目销售代理与金融贷款服务合作合同3篇
- 2024版柴油运输及运输工具维修合同范本3篇
- 2024年度技术秘密单方保密协议模板2篇
- 2024年度食堂用工服务合同2篇
- 2024版景区景点保洁服务招标合同范本
- 线性规划课后题答案
- 压裂作业质量、安全、环保管理体系与措施
- JGJ120-2012建筑基坑支护技术规程
- 国防教育基地建设项目运营方案
- 维生素B市场研究报告
- 四川省广安市2023年九年级上学期期末化学试题附答案
- 2022年云南省昆明市中考语文真题答案详解
- 五年级信息技术上册期末试卷及答案
- 成长计划300字初中综合素质评价初三
- 工厂空气重度污染应急预案
- 清华大学《工程伦理》网课习题及期末考试答案
评论
0/150
提交评论