版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
多媒體與網(wǎng)絡(luò)第1頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月第11章多媒體與網(wǎng)絡(luò)第2頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月11.1.1媒體播放器概述
1.媒體播放器
MultimediaMCI控件管理媒體控制接口(MCI)設(shè)備上多媒體文件的錄制與回放。實(shí)際上,這種控件是一組按鈕,用來(lái)向諸如聲卡、MIDI序列發(fā)生器、CD-ROM驅(qū)動(dòng)器、視頻CD播放器、視頻磁帶記錄器及播放器等設(shè)備發(fā)出MCI命令。MCI控件還支持Windows(*.avi)視頻文件的回放。要在VB工程中使用MultimediaMCI控件,需要在菜單上選擇“工程→部件”選項(xiàng),在“部件”對(duì)話框的“控件”選項(xiàng)卡中找到項(xiàng),添加到工程中。添加后,在工具箱中將出現(xiàn)圖標(biāo)。設(shè)計(jì)時(shí),將MultimediaMCI控件添加到一個(gè)窗體上,如圖11-1所示圖11-1MultimediaMCI控件添加到窗體上第3頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月將按鈕分別定義為Prev(上一首)、Next(下一首)、Play(播放)、Pause(暫停)、Back(后退)、Step(步進(jìn))、Stop(停止)、Record(錄音)和Eject(彈出)。需要使用或顯示某幾個(gè)按鈕時(shí),可以將其中的按鈕屬性Visible和Enabled設(shè)置為T(mén)rue;否則,設(shè)置其屬性值為false。第4頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月2.主要屬性(1)Command屬性:指定將要執(zhí)行的MCI
命令。語(yǔ)法:Command[=cmdstring$]說(shuō)明:參數(shù)cmdstring$給出了將要執(zhí)行的MCI命令的名稱:Open、Close、Play、Pause、Stop、Back、Step、Prev、Next、Seek、Record、Eject、Sound或Save。這些命令被立即執(zhí)行,并將錯(cuò)誤代碼存放在Error屬性中。表11-1描述了所有的命令及其使用的屬性。如果沒(méi)有對(duì)某個(gè)屬性進(jìn)行設(shè)置,它既可以使用默認(rèn)值(給出在屬性名后的括號(hào)中),也有可能不使用該屬性(沒(méi)有列出默認(rèn)值)。命令描述/所用的屬性O(shè)pen使用MCI_OPEN命令打開(kāi)一設(shè)備。Notify(False)Wait(True)SharableDeviceTypeFileNameClose使用MCI_CLOSE命令關(guān)閉一設(shè)備。第5頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月續(xù)表Notify(False)Wait(True)Play使用MCI_PLAY命令播放一設(shè)備。Notify(True)Wait(False)FromToPause使用MCI_PAUSE命令暫停播放或記錄。如果在設(shè)備已經(jīng)暫停時(shí)執(zhí)行這一命令,使用MCI_RESUME命令重新開(kāi)始播放或記錄。Notify(False)Wait(True)Stop使用MCI_STOP命令停止播放或記錄。Notify(False)Wait(True)Back使用MCI_STEP命令向后單步。Notify(False)Wait(True)Frames第6頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月續(xù)表Step使用MCI_STEP命令向前單步。Notify(False)Wait(True)FramesPrev使用Seek命令定位到當(dāng)前曲目的開(kāi)始部分。如果在上一次Prev命令之后三秒之內(nèi)再次執(zhí)行這一命令,那么就定位到上一個(gè)曲目的開(kāi)始部分,如果已經(jīng)處在第一個(gè)曲目?jī)?nèi),那么就只是定位到第一個(gè)曲目的開(kāi)始部分。第7頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月命令描述/所用的屬性Notify(False)Wait(True)Next使用Seek命令定位到下一個(gè)曲目的開(kāi)始部分(如果已經(jīng)處在最后一個(gè)曲目?jī)?nèi),那么就定位到最后一個(gè)曲目的開(kāi)始部分)。Notify(False)Wait(True)Seek如果沒(méi)有進(jìn)行播放,那么就使用MCI_SEEK命令搜索一個(gè)位置。如果播放正在進(jìn)行,那么就使用MCI_PLAY命令從給定位置開(kāi)始繼續(xù)播放。Notify(False)Wait(True)ToRecord使用MCI_RECORD命令進(jìn)行記錄。續(xù)表第8頁(yè),課件共62頁(yè),創(chuàng)作于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命令保存打開(kāi)的文件。Notify(False)Wait(True)FileName續(xù)表第9頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月其中:1)DeviceType屬性:指定要打開(kāi)的MCI設(shè)備的類型。語(yǔ)法:DeviceType[=device$]
說(shuō)明:參數(shù)device$是要打開(kāi)的MCI設(shè)備的類型,例如:AVIVideo、CDAudio、DAT、DigitalVideo、MMMovie、其它、Overlay、掃描儀、序列發(fā)生器、VCR、視盤(pán)或WaveAudio。打開(kāi)簡(jiǎn)單設(shè)備(如不使用文件的音頻CD)時(shí),該屬性必須設(shè)置。如果文件的擴(kuò)展名沒(méi)有指定將要使用的設(shè)備,打開(kāi)復(fù)雜MCI設(shè)備時(shí)也必須設(shè)置該屬性。2)Wait屬性:決定MultimediaMCI控件是否要等到下一條MCI命令完成,才能將控件返回應(yīng)用程序。在設(shè)計(jì)時(shí),該屬性不可用。對(duì)該屬性賦值時(shí),只對(duì)下一條MCI命令有效。后面的MCI命令會(huì)一直忽略Wait屬性,除非用另外一個(gè)值(不同的或可標(biāo)識(shí)的)為它賦值。第10頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月3)Sharable屬性:決定多個(gè)程序能否共享同一臺(tái)MCI設(shè)備。若取值為False,表示其它控件或應(yīng)用程序不能訪問(wèn)這臺(tái)設(shè)備;若取值為T(mén)rue,表示多個(gè)控件或應(yīng)用程序能夠打開(kāi)這臺(tái)設(shè)備。4)Notify屬性:決定下一條MCI命令是否使用MCI通知服務(wù)。如果被設(shè)置為T(mén)rue,則Notify屬性在下一條MCI命令完成時(shí)產(chǎn)生一個(gè)回調(diào)事件(Done)。設(shè)計(jì)時(shí)該屬性不可用。(2)UpdateInterval屬性:規(guī)定兩次連續(xù)的StatusUpdate事件之間的毫秒數(shù)。語(yǔ)法:UpdateInterval[=milliseconds%]
說(shuō)明:參數(shù)milliseconds%規(guī)定事件之間的毫秒數(shù)。如果毫秒數(shù)是0,表明沒(méi)有StatusUpdate事件發(fā)生。第11頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月3.主要事件(1)StatusUpdate事件(MultimediaMCI控件):按UpdateInterval屬性給定的時(shí)間間隔自動(dòng)地發(fā)生。語(yǔ)法:PrivateSubMMControl_StatusUpdate()
說(shuō)明:該事件允許應(yīng)用程序更新顯示,以通知用戶當(dāng)前MCI設(shè)備的狀態(tài)。應(yīng)用程序可以從Position、Length和Mode等屬性中獲得狀態(tài)信息。(2)Done事件:當(dāng)Notify
屬性為T(mén)rue的MCI
命令結(jié)束時(shí)發(fā)生。語(yǔ)法:PrivateSubMMControl_Done(NotifyCodeAsInteger)
說(shuō)明:參數(shù)NotifyCode表示MCI命令是否成功??梢允潜?1-2中的任意設(shè)置值。第12頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月表11-2參數(shù)NotifyCode的設(shè)置值值設(shè)置值/Result1mciSuccessful命令成功的執(zhí)行。2mciSuperseded命令被其它命令所替代。4mciAborted命令被用戶中斷。8mciFailure命令失敗。第13頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月11.1.2簡(jiǎn)單媒體播放器
[例11-1]制作播放WAVMP3mid等音頻文件的播放器。[分析]播放文件一般步驟:設(shè)置設(shè)備打開(kāi)的屬性;指定播放文件;打開(kāi)設(shè)備,開(kāi)始播放;播放完畢,關(guān)閉設(shè)備。[建立工程]新建窗體,命名為frmWAV。向窗體添加一個(gè)MCI控件,一個(gè)通用對(duì)話框控件,四個(gè)按鈕,五個(gè)label控件,一個(gè)文本框控件,界面布局如圖11-2所示。Text1cmdOpenCommonDialog1MMControl1cmdPlaycmdPausecmdCloseLabel2
Label3圖11-2界面布局第14頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月[程序代碼]’打開(kāi)文件按鈕代碼PrivateSubcmdOpen_Click()'未打開(kāi)文件前,讓播放\暫停\關(guān)閉按鈕不可用
cmdPlay.Enabled=FalsecmdPause.Enabled=FalsecmdClose.Enabled=False'選擇文件對(duì)話框
CommonDialog1.DialogTitle="選擇播放文件"CommonDialog1.Filter="*.wav|*.wav|*.mid|*.mid|*.mp3|*.mp3"CommonDialog1.FileName=""CommonDialog1.ShowOpen
'如果選擇了文件,則設(shè)置MCI屬性
IfCommonDialog1.FileName<>""ThenText1.Text=CommonDialog1.FileName第15頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月
'打開(kāi)文件前,先停止上一次的播放
MMControl1.Command="close"
MMControl1.FileName=Text1.TextMMControl1.DeviceType=""MMControl1.Command="open"
'顯示文件播放長(zhǎng)度
Label2.Caption=ToHMS(MMControl1.Length)
'出發(fā)StatusUpdate事件,在該事件中,得到當(dāng)前播放進(jìn)度
MMControl1.UpdateInterval=100
cmdPlay.Enabled=TrueEndIfEndSub'開(kāi)始播放PrivateSubcmdPlay_Click()MMControl1.Command="play"cmdPlay.Enabled=FalsecmdPause.Enabled=TruecmdClose.Enabled=TrueEndSub第16頁(yè),課件共62頁(yè),創(chuàng)作于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'顯示播放進(jìn)度PrivateSubMMControl1_StatusUpdate()Label3.Caption=ToHMS(MMControl1.Position)第17頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月'播放完畢,循環(huán)播放
IfMMControl1.Position>=MMControl1.LengthThenMMControl1.Command="prev"MMControl1.Command="play"EndIfEndSub'轉(zhuǎn)換為時(shí)分秒格式FunctionToHMS(TsAsLong)AsStringTs=Ts/1000hh=Ts\3600mm=(TsMod3600)\60ss=(TsMod3600)Mod60
ToHMS=Format(hh,"00")&";"&Format(mm,"00")&";"&Format(ss,"00")EndFunction第18頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月[運(yùn)行結(jié)果]單擊“打開(kāi)文件”按鈕,選擇MAVMID或MP3文件后,“播放”按鈕可用;單擊“播放”按鈕,label3將顯示播放進(jìn)度;控制“暫停”或“停止”按鈕,實(shí)現(xiàn)相應(yīng)的操作。顯示效果如圖11-3所示。一般情況下,如果要使用自定義按鈕代替MCI操作按鈕,MCI控件應(yīng)將Visible屬性設(shè)置為false,讓其不可見(jiàn)。圖11-3播放器運(yùn)行結(jié)果第19頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月11.1.3錄音與放音
[例11-2]通過(guò)電腦麥克風(fēng)錄制聲音文件,保存到本機(jī),并回放該文件。[分析]錄制文件的一般步驟如下:設(shè)置設(shè)備打開(kāi)的屬性;指定錄制文件保存的位置;打開(kāi)設(shè)備,開(kāi)始錄制;錄制完畢,保存文件;關(guān)閉設(shè)備。使用MultimediaMCI控件記錄音頻信號(hào)之前,應(yīng)打開(kāi)一個(gè)新的文件,以保證記錄聲音的數(shù)據(jù)文件格式與系統(tǒng)記錄格式完全兼容。關(guān)閉MCI設(shè)備前,應(yīng)該發(fā)出MCISave命令,把記錄的數(shù)據(jù)保存到文件中去。第20頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月[建立工程]添加窗體frmRec,向窗體添加MCI控件及四個(gè)按鈕控件,分別命名為cmdRec、cmdPause、cmdSave和cmdPlay,如圖11-4所示。[程序代碼]'開(kāi)始錄音PrivateSubcmdRec_Click()MMControl1.Wait=TrueMMControl1.DeviceType="WaveAudio"MMControl1.FileName="c:\myRec.wav"'必須先設(shè)置文件名
MMControl1.Command="open"MMControl1.Command="Record"EndSub'暫停和繼續(xù)錄音PrivateSubcmdPause_Click()IfcmdPause.Caption="暫停錄音"ThencmdPause.Caption="繼續(xù)錄音"MMControl1.Command="pause"ElsecmdPause.Caption="暫停錄音"MMControl1.Command="Record"EndIfEndSub第21頁(yè),課件共62頁(yè),創(chuàng)作于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界面布局
[運(yùn)行結(jié)果]如圖11-5所示。第22頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月[運(yùn)行結(jié)果]如圖11-5所示。圖11-5運(yùn)行結(jié)果。為代碼簡(jiǎn)單起見(jiàn),未對(duì)按鈕之間的操作邏輯進(jìn)行控制。請(qǐng)讀者完善例11-2第23頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月11.2Internet傳輸控件
1.Internet傳輸控件InternetTransfer控件(以下簡(jiǎn)稱稱inet控件)支持超文本傳輸協(xié)議(HTTP)和文件傳輸協(xié)議(FTP),它們是Internet網(wǎng)上使用最廣泛的兩種協(xié)議。使用HTTP協(xié)議可以連接全球信息網(wǎng)(WorldWideWeb)服務(wù)器,以檢索HTML文檔。使用FTP協(xié)議可以在FTP服務(wù)器上登錄,以下載和加載文件。UserName和Password屬性可讓用戶在要求驗(yàn)證身份的私有服務(wù)器上登錄。另外,也可以連接公用的FTP服務(wù)器,并下載文件。Execute方法支持普通的FTP命令,如CD和GET。要使用inet控件,需要在菜單欄上選擇“工程→部件”選項(xiàng),在“部件”對(duì)話框的“控件”選項(xiàng)卡中找到項(xiàng),添加到工程中。添加后,在工具箱中將出現(xiàn)圖標(biāo)。第24頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月2.主要屬性(1)URL屬性:設(shè)置或返回Execute或OpenURL方法使用的URL。URL屬性至少必須包含一個(gè)協(xié)議(FTP或HTTP)和一個(gè)遠(yuǎn)程主機(jī)名。URL屬性可以是目錄或文件。例如,下面兩個(gè)URLs都是有效的:'設(shè)置URL,僅返回文件目錄:Inet1.URL="HTTP://"'該URL將返回文件的文本:Inet1.URL=HTTP:///disclaimer.txt(2)RequestTimeout屬性:設(shè)置或返回超時(shí)截止前按秒計(jì)算的等待時(shí)間長(zhǎng)度。如果請(qǐng)求在指定的時(shí)間內(nèi)還沒(méi)有響應(yīng),并且該請(qǐng)求使用OpenURL方法(同步地),將產(chǎn)生錯(cuò)誤;如果請(qǐng)求使用Execute方法,將引發(fā)帶錯(cuò)誤碼的StateChanged事件。把該屬性設(shè)置為0,則意味著不限定等待時(shí)間。(3)Protocol屬性:設(shè)置或返回一個(gè)值,指定和Execute方法一起使用的協(xié)議。第25頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月表11-3Protocol的有效設(shè)置值常數(shù)值描述icUnknown0未知的。icDefault1缺省協(xié)議。icFTP2FTP。文件傳輸協(xié)議。icReserved3為將來(lái)預(yù)留。icHTTP4HTTP。超文本傳輸協(xié)議。icHTTPS5安全HTTP。第26頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月(4)UserName屬性:設(shè)置或返回與請(qǐng)求一起發(fā)送到遠(yuǎn)程計(jì)算機(jī)的名稱。如果該屬性為空,提出請(qǐng)求時(shí)該控件將把“anonymous”作為用戶名來(lái)發(fā)送。(5)Password屬性:設(shè)置或返回一個(gè)密碼,該密碼將和請(qǐng)求一道被發(fā)送,用以在遠(yuǎn)程計(jì)算機(jī)上登錄。如果該屬性為空,控件將發(fā)送一個(gè)缺省的密碼。第27頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月3.主要方法(1)Execute方法作用:執(zhí)行對(duì)遠(yuǎn)程服務(wù)器的請(qǐng)求。只能發(fā)送對(duì)特定的協(xié)議有效的請(qǐng)求。語(yǔ)法格式:Executeurl,operation,data,requestHeadersExecute屬性的語(yǔ)法包含以下部分:url:可選,字符串,指定控件將要連接的URL。如果這里未指定URL,將使用URL屬性中指定的URL。Operation:可選,字符串,指定將要執(zhí)行的操作類型。支持的操作列表參見(jiàn)下面的“設(shè)置值”。Data:可選,字符串,指定用于操作的數(shù)據(jù)(參見(jiàn)下面的“設(shè)置值”)。requestHeaders:可選,字符串,指定由遠(yuǎn)程服務(wù)器傳來(lái)的附加的標(biāo)頭。格式:headername:headervaluevbCrLf第28頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月(2)OpenURL方法打開(kāi)并返回指定URL的文檔,文檔以變體型返回。語(yǔ)法格式:OpenUrlurl[,datatype]其中:url:必需的,被檢索文檔的URL。Datatype:可選,整數(shù),如“設(shè)置值”所示,指定數(shù)據(jù)類型。Datatype的設(shè)置值:icString0:缺省值,把數(shù)據(jù)作為字符串來(lái)檢索。icByteArray1:把數(shù)據(jù)作為字節(jié)數(shù)組來(lái)檢索。4.主要事件Inet控件只有一個(gè)事件:StateChanged事件。該事件在連接中狀態(tài)發(fā)生改變時(shí)觸發(fā)。事件格式:tateChanged(ByValStateAsInteger)其中,State為整數(shù),取值見(jiàn)表11-4的“設(shè)置值”,用于指定狀態(tài)。第29頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月表11-4State的設(shè)置值常數(shù)值描述icNone0無(wú)狀態(tài)可報(bào)告。icHostResolvingHost1該控件正在查詢所指定的主機(jī)的IP地址。icHostResolved2該控件已成功地找到所指定的主機(jī)的IP地址。icConnecting3該控件正在與主機(jī)連接。icConnected4該控件已與主機(jī)連接成功。icRequesting5該控件正在向主機(jī)發(fā)送請(qǐng)求。icRequestSent6該控件發(fā)送請(qǐng)求已成功。icReceivingResponse7該控件正在接收主機(jī)的響應(yīng)。icResponseReceived8該控件已成功地接收到主機(jī)的響應(yīng)。icDisconnecting9該控件正在解除與主機(jī)的連接。icDisconnected10該控件已成功地與主機(jī)解除了連接。icError11與主機(jī)通訊時(shí)出現(xiàn)了錯(cuò)誤。icResponseCompleted12該請(qǐng)求已經(jīng)完成,并且所有數(shù)據(jù)均已接收到。第30頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月使用inet控件的一般思路:設(shè)置URL屬性,指定登錄的服務(wù)器;如果登錄的是FTP服務(wù)器,需要指定用戶名和密碼,可以匿名登錄的FTP服務(wù)器無(wú)需設(shè)置其UserName和Password屬性。然后通過(guò)Execute方法傳遞get命令參數(shù)下載文件;傳遞send命令參數(shù)上傳文件.第31頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月11.2.2利用控件上傳下載文件
[例11-3][分析]要正確運(yùn)行本例,需要在本地建立FTP服務(wù)器,在FTP服務(wù)器中存放有A6.MP3文件或其它任意文件。此外,也可以指定任意一個(gè)實(shí)際存在的FTP服務(wù)器,輸入用戶名和密碼進(jìn)行下載和上傳文件。[建立工程]添加三個(gè)文本框,分別命名為Dlurl、Dlname、DLpwd,用于輸入服務(wù)器IP地址、用戶名和密碼。添加三個(gè)按鈕,分別為下載文件、上傳文件和保存帳號(hào)設(shè)置,并重新命名為:cmd_get、cmd_send和cmd_save。界面布局如圖11-4所示。第32頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月cmd_getcmd_sendDLurlDLnameDLpwdlbl_statecmd_save圖11-4界面布局第33頁(yè),課件共62頁(yè),創(chuàng)作于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頁(yè),課件共62頁(yè),創(chuàng)作于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'等待下載結(jié)束<>1235 DoEvents36 IfVal(Txt_ErrNum)=11Then'下載過(guò)程出現(xiàn)錯(cuò)誤37 GoToendjump38 EndIf39 Wend40 41 Inet1.Execute,"close"'關(guān)閉連接第35頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月42 Inet1.Execute,"quit"'退出服務(wù)器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="空狀態(tài)!"65 Case1:66 state_info="正在查找服務(wù)器...!"第36頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月67 Case2:70 state_info="找到服務(wù)器...!"71 Case3:72 state_info="準(zhǔn)備連接服務(wù)器!"73 Case4:74 state_info="與服務(wù)器連接建立!"75 Case5:76 state_info="向服務(wù)器發(fā)出請(qǐng)求!"77 Case6:78 state_info="已經(jīng)向服務(wù)器發(fā)出請(qǐng)求!"79 Case7:80 state_info="服務(wù)器收到請(qǐng)求!"81 Case8:82 state_info="服務(wù)器已經(jīng)收到響應(yīng)!正在傳送...."83 Case9:84 state_info="在斷開(kāi)連接....!"85 Case10:86 state_info="已經(jīng)斷開(kāi)服務(wù)器!"87 Case11:88 state_info="發(fā)生通訊錯(cuò)誤!"&Inet1.ResponseInfo89 Case12:90 state_info="向服務(wù)器發(fā)出的請(qǐng)求結(jié)束!傳送完畢!"91 EndSelect92 93 lbl_state.Caption=state_info94 EndSub第37頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月12.3winsock傳輸控件
11.3.1winsock傳輸控件概述利用WinSock控件可以與遠(yuǎn)程計(jì)算機(jī)建立連接,并通過(guò)用戶數(shù)據(jù)文報(bào)協(xié)議(UDP)或者傳輸控制協(xié)議(TCP)進(jìn)行數(shù)據(jù)交換。這兩種協(xié)議都可以用來(lái)創(chuàng)建客戶與服務(wù)器應(yīng)用程序。與Timer控件類似,WinSock控件在運(yùn)行時(shí)是不可見(jiàn)的。要使用Winsock控件,需要在菜單欄上選擇“工程→部件”選項(xiàng),在“部件”對(duì)話框的“控件”選項(xiàng)卡中找到項(xiàng),添加到工程。添加后,在工具箱中將出現(xiàn)圖標(biāo)。第38頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月1.可能的用途(1)創(chuàng)建收集用戶信息的客戶端應(yīng)用程序,并將收集的信息發(fā)送到某中央服務(wù)器。(2)創(chuàng)建一個(gè)服務(wù)器應(yīng)用程序,作為多個(gè)用戶的數(shù)據(jù)的匯入點(diǎn)。(3)創(chuàng)建“聊天”應(yīng)用程序。2.選擇通訊協(xié)議使用WinSock控件時(shí),首先需要考慮使用什么協(xié)議??梢允褂玫膮f(xié)議包括TCP和UDP。兩種協(xié)議之間的重要區(qū)別在于它們的連接狀態(tài):(1)TCP協(xié)議是基于連接的協(xié)議,可以將它與電話系統(tǒng)相比。開(kāi)始數(shù)據(jù)傳輸之前,用戶必須先建立連接。(2)UDP協(xié)議是一種無(wú)連接協(xié)議,兩臺(tái)計(jì)算機(jī)之間的傳輸類似于傳遞郵件:消息從一臺(tái)計(jì)算機(jī)發(fā)送到另一臺(tái)計(jì)算機(jī),但是兩者之間沒(méi)有明確的連接。另外,單次傳輸?shù)淖畲髷?shù)據(jù)量取決于具體的網(wǎng)絡(luò)。具體選擇哪一種協(xié)議,通常由需要?jiǎng)?chuàng)建的應(yīng)用程序決定。下面的幾個(gè)問(wèn)題將有助于選擇適宜的協(xié)議:(1)收發(fā)數(shù)據(jù)時(shí),應(yīng)用程序是否需要得到客戶端或服務(wù)器的確認(rèn)信息?如果需要,使用TCP協(xié)議,在收發(fā)數(shù)據(jù)之前先建立明確的連接。第39頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月(2)數(shù)據(jù)量是否特別大(例如圖象與聲音文件)?建立連接后,TCP協(xié)議將維護(hù)連接并確保數(shù)據(jù)的完整性。不過(guò),這種連接需要更多的計(jì)算資源,因而是比較“昂貴”的。(3)數(shù)據(jù)發(fā)送是間歇的,還是在一個(gè)會(huì)話內(nèi)?例如,如果應(yīng)用程序在某個(gè)任務(wù)完成時(shí)需要通知某臺(tái)計(jì)算機(jī),UDP協(xié)議更適宜。UDP協(xié)議適合發(fā)送少量的數(shù)據(jù)。3.協(xié)議的設(shè)置設(shè)計(jì)時(shí),可以按以下方式設(shè)置應(yīng)用程序使用的協(xié)議:在“屬性”窗口中單擊“協(xié)議”,然后選擇sckTCPProtocol或者sckUDPProtocol。也可以用程序代碼設(shè)置Protocol屬性,如下所示:Winsock1.Protocol=sckTCPProtocol第40頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月4.主要屬性(1)Protocol:返回或設(shè)置Winsock控件使用的協(xié)議(TCP或UDP協(xié)議)。Protocol屬性的設(shè)置值見(jiàn)表11-5。表11-5protocol屬性的設(shè)置值常數(shù)值描述sckTCPProtocol0缺省的。TCP協(xié)議。sckUDPProtocol1UDP協(xié)議。第41頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月(2)RemoteHost:返回或設(shè)置遠(yuǎn)程計(jì)算機(jī),控件向它發(fā)送數(shù)據(jù)或從它那里接收數(shù)據(jù)。既可提供主機(jī)名,如FTP://;也可提供點(diǎn)格式下的IP地址字符串,如“”。(3)RemoteHostIP:返回遠(yuǎn)程主機(jī)的IP地址。若客戶應(yīng)用程序已用Connect方法建立連接,屬性中包含了遠(yuǎn)程機(jī)器的IP字符串。對(duì)于服務(wù)器應(yīng)用程序,請(qǐng)求連接(ConnectionRequest事件)后,屬性包含遠(yuǎn)程計(jì)算機(jī)的IP地址字符串,該字符串啟動(dòng)了連接。使用UDP協(xié)議時(shí),在DataArrival事件出現(xiàn)后,屬性包含了發(fā)送UDP數(shù)據(jù)的計(jì)算機(jī)的IP地址。(4)LocalHostName:返回本地計(jì)算機(jī)名。設(shè)計(jì)時(shí)是只讀的,而且不可用。(5)LocalIP:返回本地計(jì)算機(jī)的IP地址,格式是IP地址加點(diǎn)字符串(xxx.xxx.xxx.xxx)。設(shè)計(jì)時(shí)是只讀的,而且不可用。第42頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月(6)LocalPort:返回或者設(shè)置所用的本地端口。設(shè)計(jì)時(shí)是可讀/寫(xiě)的,而且可用。對(duì)客戶來(lái)說(shuō),該屬性指定發(fā)送數(shù)據(jù)的本地端口。如果應(yīng)用程序不需要特定端口,則指定0為端口號(hào)。這種情況下,控件將選擇一個(gè)隨機(jī)端口。建立起連接后,該端口是用于TCP連接的本地端口。對(duì)于服務(wù)器來(lái)說(shuō),是用于偵聽(tīng)的本地端口。如果指定端口0,就使用一個(gè)隨機(jī)端口。調(diào)用Listen方法后,屬性包含了已選定的實(shí)際端口。(7)BytesReceived:返回接收到的(當(dāng)前在接收端緩沖區(qū)內(nèi)的)數(shù)據(jù)的數(shù)量。使用GetData方法獲取數(shù)據(jù)。設(shè)計(jì)時(shí)是只讀的,而且不可用。(8)State:返回控件的狀態(tài),用枚舉類型表示。設(shè)計(jì)時(shí)是只讀的,而且不可用。State屬性的設(shè)置值見(jiàn)表11-6。第43頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月常數(shù)值描述sckClosed0缺省的。關(guān)閉sckOpen1打開(kāi)sckListening2偵聽(tīng)sckConnectionPending3連接掛起sckResolvingHost4識(shí)別主機(jī)sckHostResolved5已識(shí)別主機(jī)sckConnecting6正在連接sckConnected7已連接sckClosing8同級(jí)人員正在關(guān)閉連接sckError9錯(cuò)誤表11-6State屬性的設(shè)置值第44頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月5.主要方法(1)Connect方法:要求連接到遠(yuǎn)程計(jì)算機(jī)。說(shuō)明:想建立TCP連接時(shí),必須調(diào)用Connect方法。語(yǔ)法:ConnectremoteHost,remotePort返回值:無(wú)語(yǔ)法說(shuō)明見(jiàn)表11-7。部分描述remoteHost必需的。要連接的遠(yuǎn)程計(jì)算機(jī)的名稱。remotePort要連接的遠(yuǎn)程計(jì)算機(jī)的端口。第45頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月(2)Accept方法:僅適用于TCP服務(wù)器應(yīng)用程序。處理ConnectionRequest事件時(shí)用這個(gè)方法接受新連接。語(yǔ)法:Acceptrequested返回值:無(wú)說(shuō)明:在ConnectionRequest事件中使用Accept方法。ConnectionRequest事件有一個(gè)對(duì)應(yīng)的參數(shù),即RequestID參數(shù),該參數(shù)應(yīng)該傳給Accept方法。例如:PrivateSubWinsock1_ConnectionRequest(ByValrequestIDAsLong)'測(cè)試State屬性,如果當(dāng)前連接是打開(kāi)的話,則關(guān)閉連接。
IfWinsock1.State<>sckClosedThenWinsock1.Close'將requestID參數(shù)值傳遞給Accept方法。
Winsock1.AcceptrequestedEndSub(3)Listen方法:創(chuàng)建套接字并將其設(shè)置為偵聽(tīng)模式。該方法僅適用于TCP連接。語(yǔ)法:Listen返回值:無(wú)說(shuō)明:當(dāng)有新連接時(shí),就會(huì)出現(xiàn)ConnectionRequest事件。處理ConnectionRequest事件時(shí),應(yīng)用程序應(yīng)該(在一個(gè)新的控件示例上)用Accept方法接受連接。第46頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月(4)GetData方法:獲取當(dāng)前的數(shù)據(jù)塊并將其存儲(chǔ)在變體類型的變量中。語(yǔ)法:GetDatadata,[type,][maxLen]語(yǔ)法說(shuō)明見(jiàn)表11-8。表11-8GetData方法的語(yǔ)法說(shuō)明部分描述Data在方法成功返回之后存儲(chǔ)獲取數(shù)據(jù)的地方。如果對(duì)請(qǐng)求的類型沒(méi)有足夠可用的數(shù)據(jù),則將data設(shè)置成Empty。Type可選的。獲取的數(shù)據(jù)類型,如下例“設(shè)置值”所示。maxLen可選的。在接收到字節(jié)數(shù)組或字符串時(shí)所需大小。如果對(duì)字節(jié)數(shù)組或字符串、參數(shù)丟失、則將獲取所有可用數(shù)據(jù)。如果提供的數(shù)據(jù)類型不是字節(jié)數(shù)組或字符串,則忽略這個(gè)參數(shù)。第47頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月type
的設(shè)置值見(jiàn)表11-9。表11-9type
的設(shè)置值描述常數(shù)BytevbByteIntegervbIntegerLongvbLong描述常數(shù)SinglevbSingleDoublevbDoubleCurrencyvbCurrencyDatevbDateBooleanvbBooleanSCODEvbErrorStringvbStringByteArrayvbArray+vbByte第48頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月說(shuō)明:通常將GetData方法與DataArrival事件并用,而DataArrival事件包含totalBytes參數(shù)。如果指定一個(gè)比totalBytes參數(shù)小的maxlen,則將得到警告10040,指出剩余的字節(jié)將丟失。(5)Bind方法:指定用于TCP連接的LocalPort和LocalIP。如果有多協(xié)議適配卡,就用這個(gè)方法。語(yǔ)法:Bind
LocalPort,LocalIPBind方法的語(yǔ)法說(shuō)明見(jiàn)表11-10。表11-10Bind方法的語(yǔ)法說(shuō)明部分描述LocalPort用來(lái)建立連接的端口。LocalIP用來(lái)建立連接的本地Internet地址。說(shuō)明:調(diào)用Listen方法之前,必須調(diào)用Bind方法。第49頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月6.主要事件(1)Connect事件:當(dāng)一個(gè)Connect操作完成時(shí)發(fā)生。說(shuō)明:使用Connect事件確認(rèn)已經(jīng)成功建立了一個(gè)連接。(2)ConnectionRequest事件:當(dāng)遠(yuǎn)程計(jì)算機(jī)請(qǐng)求連接時(shí)出現(xiàn)。說(shuō)明:僅適用于TCP服務(wù)器應(yīng)用程序。請(qǐng)求一個(gè)新連接時(shí)激活該事件。激活該事件后,RemoteHostIP和RemotePort屬性存儲(chǔ)有關(guān)客戶的信息;服務(wù)器可決定是否接受連接。如果不接受新連接,則同級(jí)人員(客戶)將得到Close事件。(在一個(gè)新控件示例上)用Accept方法接受新連接。(3)DataArrival事件:當(dāng)新數(shù)據(jù)到達(dá)時(shí)出現(xiàn)。說(shuō)明:如果沒(méi)有獲取一個(gè)GetData調(diào)用中的全部數(shù)據(jù),則事件不會(huì)出現(xiàn)。只有存在新數(shù)據(jù)時(shí)才激活該事件。可隨時(shí)用BytesReceived屬性檢查可用的數(shù)據(jù)量。(4)SendComplete事件:完成一個(gè)發(fā)送操作時(shí)出現(xiàn)。(5)Error事件:無(wú)論何時(shí),只要后臺(tái)處理中出現(xiàn)錯(cuò)誤(例如連接失敗,或在后臺(tái)收發(fā)數(shù)據(jù)失?。?,事件就會(huì)出現(xiàn)。(6)Close事件:當(dāng)遠(yuǎn)程計(jì)算機(jī)關(guān)閉連接時(shí)出現(xiàn)。應(yīng)用程序應(yīng)正確使用Close方法關(guān)閉TCP連接。第50頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月11.3.2TCP連接初步
[例11-4]創(chuàng)建一個(gè)簡(jiǎn)單的TCP服務(wù)器和客戶端。[分析]如果應(yīng)用程序要使用TCP協(xié)議,首先必須決定應(yīng)用程序是服務(wù)器還是客戶端。如果要?jiǎng)?chuàng)建一個(gè)服務(wù)器端,則應(yīng)用程序需要“監(jiān)聽(tīng)”指定的端口。當(dāng)客戶端提出連接請(qǐng)求時(shí),服務(wù)器端能夠接受請(qǐng)求并建立連接。連接建立后,客戶端與服務(wù)器端可以自由地互相通訊。第51頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月1.創(chuàng)建TCP服務(wù)器[建立工程]創(chuàng)建新的StandardEXE工程。將默認(rèn)窗體的名稱改為frmServer。將窗體的標(biāo)題改為“TCP服務(wù)器”。在窗體中放入一個(gè)Winsock控件,將其名字改為tcpServer。在窗體上添加兩個(gè)TextBox控件,第一個(gè)命名為txtSendData,第二個(gè)命名txtOutput。[程序代碼]為窗體添加如下的代碼。PrivateSubForm_Load()'將LocalPort屬性設(shè)置為一個(gè)整數(shù)。'然后調(diào)用Listen方法。tcpServer.LocalPort=1001tcpServer.ListenfrmClient.Show'顯示客戶端的窗體。EndSubPrivateSubtcpServer_ConnectionRequest_(ByValrequestIDAsLong)第52頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月'檢查控件的State屬性是否為關(guān)閉的。'如果不是,'在接受新的連接之前先關(guān)閉此連接。IftcpServer.State<>sckClosedThen_tcpServer.Close'接受具有requestID參數(shù)的'連接。tcpServer.AcceptrequestIDEndSubPrivateSubtxtSendData_Change()'名為txtSendData的TextBox控件中'包含了要發(fā)送的數(shù)據(jù)。當(dāng)用戶往文本框中'鍵入數(shù)據(jù)時(shí),使用SendData方法'發(fā)送輸入的字符串。tcpServer.SendDatatxtSendData.TextEndSubPrivateSubtcpServer_DataArrival_(ByValbytesTotalAsLong)第53頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月'為進(jìn)入的數(shù)據(jù)聲明一個(gè)變量。'調(diào)用GetData方法,并將數(shù)據(jù)賦予名為txtOutput'的TextBox的Text屬性。DimstrDataAsStringtcpServer.GetDatastrDatatxtOutput.Text=strDataEndSub說(shuō)明:以上步驟創(chuàng)建了一個(gè)簡(jiǎn)單的服務(wù)器應(yīng)用程序。為了使它能夠工作,還必須為它創(chuàng)建一個(gè)客戶端的應(yīng)用程序。第54頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月2.創(chuàng)建TCP客戶端[建立工程]在工程中添加一個(gè)新的窗體,將其命名為frmClient。將窗體的標(biāo)題改為“TCPClient”。在窗體中添加一個(gè)Winsock控件,并將其命名為tcpClient。在frmClient中添加兩個(gè)TextBox控件。將第一個(gè)命名為txtSend,第二個(gè)為txtOutput。在窗體上放一個(gè)CommandButton控件,并將其命名為cmdConnect。將CommandButton控件的標(biāo)題改為Connect。[程序代碼]在窗體中添加如下的代碼。第55頁(yè),課件共62頁(yè),創(chuàng)作于2023年2月注意:必須將RemoteHost屬性值修改為計(jì)算機(jī)名。PrivateSubForm_Load()'Winsock控件的名字為tcpClient。
'注意:要指定遠(yuǎn)程主機(jī),可以使用
'IP地址(例如:""),也可以使用
'計(jì)算機(jī)的“好聽(tīng)的名字”如下所示。
tcpClient.RemoteHost="RemoteComputerName"tcpClient.RemotePort=1001EndSubPrivateSubcmdConnect_Click()'調(diào)用Connect方法,初始化連接。
tcpClient.ConnectEndSubPrivateSubtxtSendData_Change()tcpClient.SendDatatxtSend.TextEndSubPrivateSubtcpClient_DataArrival_(ByValbytesTotalAsLong)DimstrDataAsStringtcpClient.GetDatastrDatatxtOutput.Te
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度旅游意外受傷賠償協(xié)議書(shū)范本2篇
- 乳腺癌患者蒙醫(yī)飲食起居治療方案研制及療效觀察
- 《儒林外史》 上課課件
- 面向自動(dòng)調(diào)制識(shí)別模型的后門(mén)攻擊方法研究
- 應(yīng)急指揮系統(tǒng)的改進(jìn)與優(yōu)化
- 熟人借款合同三篇
- 2025版夏令營(yíng)拓展訓(xùn)練項(xiàng)目代理商合作協(xié)議范本3篇
- 二零二五年度行政合同訂立實(shí)務(wù)操作與案例分享3篇
- 二零二五年版?zhèn)€人股東股權(quán)轉(zhuǎn)讓協(xié)議范本適用于所有企業(yè)股權(quán)變更19篇
- 二零二五年度品牌授權(quán)銷售系統(tǒng)合同樣本2篇
- 環(huán)境與職業(yè)健康安全管理手冊(cè)
- 注射泵操作使用課件
- 2024年全國(guó)新高考1卷(新課標(biāo)Ⅰ)數(shù)學(xué)試卷(含答案詳解)
- 人教版高中生物學(xué)新舊教材知識(shí)差異盤(pán)點(diǎn)
- 四年級(jí)四年級(jí)下冊(cè)閱讀理解20篇(附帶答案解析)經(jīng)典
- 大連高新區(qū)整體發(fā)展戰(zhàn)略規(guī)劃(產(chǎn)業(yè)及功能布局)
- 國(guó)有資產(chǎn)管理法律責(zé)任與風(fēng)險(xiǎn)防控
- 未婚生子的分手協(xié)議書(shū)
- 變更監(jiān)事章程修正案范例
- 北京小客車指標(biāo)租賃協(xié)議五篇
- 輸液室運(yùn)用PDCA降低靜脈輸液患者外滲的發(fā)生率品管圈(QCC)活動(dòng)成果
評(píng)論
0/150
提交評(píng)論