多媒體與網(wǎng)絡(luò)_第1頁
多媒體與網(wǎng)絡(luò)_第2頁
多媒體與網(wǎng)絡(luò)_第3頁
多媒體與網(wǎng)絡(luò)_第4頁
多媒體與網(wǎng)絡(luò)_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

多媒體與網(wǎng)絡(luò)第1頁,課件共62頁,創(chuàng)作于2023年2月第11章多媒體與網(wǎng)絡(luò)第2頁,課件共62頁,創(chuàng)作于2023年2月11.1.1媒體播放器概述

1.媒體播放器

MultimediaMCI控件管理媒體控制接口(MCI)設(shè)備上多媒體文件的錄制與回放。實際上,這種控件是一組按鈕,用來向諸如聲卡、MIDI序列發(fā)生器、CD-ROM驅(qū)動器、視頻CD播放器、視頻磁帶記錄器及播放器等設(shè)備發(fā)出MCI命令。MCI控件還支持Windows(*.avi)視頻文件的回放。要在VB工程中使用MultimediaMCI控件,需要在菜單上選擇“工程→部件”選項,在“部件”對話框的“控件”選項卡中找到項,添加到工程中。添加后,在工具箱中將出現(xiàn)圖標(biāo)。設(shè)計時,將MultimediaMCI控件添加到一個窗體上,如圖11-1所示圖11-1MultimediaMCI控件添加到窗體上第3頁,課件共62頁,創(chuàng)作于2023年2月將按鈕分別定義為Prev(上一首)、Next(下一首)、Play(播放)、Pause(暫停)、Back(后退)、Step(步進(jìn))、Stop(停止)、Record(錄音)和Eject(彈出)。需要使用或顯示某幾個按鈕時,可以將其中的按鈕屬性Visible和Enabled設(shè)置為True;否則,設(shè)置其屬性值為false。第4頁,課件共62頁,創(chuàng)作于2023年2月2.主要屬性(1)Command屬性:指定將要執(zhí)行的MCI

命令。語法:Command[=cmdstring$]說明:參數(shù)cmdstring$給出了將要執(zhí)行的MCI命令的名稱:Open、Close、Play、Pause、Stop、Back、Step、Prev、Next、Seek、Record、Eject、Sound或Save。這些命令被立即執(zhí)行,并將錯誤代碼存放在Error屬性中。表11-1描述了所有的命令及其使用的屬性。如果沒有對某個屬性進(jìn)行設(shè)置,它既可以使用默認(rèn)值(給出在屬性名后的括號中),也有可能不使用該屬性(沒有列出默認(rèn)值)。命令描述/所用的屬性O(shè)pen使用MCI_OPEN命令打開一設(shè)備。Notify(False)Wait(True)SharableDeviceTypeFileNameClose使用MCI_CLOSE命令關(guān)閉一設(shè)備。第5頁,課件共62頁,創(chuàng)作于2023年2月續(xù)表Notify(False)Wait(True)Play使用MCI_PLAY命令播放一設(shè)備。Notify(True)Wait(False)FromToPause使用MCI_PAUSE命令暫停播放或記錄。如果在設(shè)備已經(jīng)暫停時執(zhí)行這一命令,使用MCI_RESUME命令重新開始播放或記錄。Notify(False)Wait(True)Stop使用MCI_STOP命令停止播放或記錄。Notify(False)Wait(True)Back使用MCI_STEP命令向后單步。Notify(False)Wait(True)Frames第6頁,課件共62頁,創(chuàng)作于2023年2月續(xù)表Step使用MCI_STEP命令向前單步。Notify(False)Wait(True)FramesPrev使用Seek命令定位到當(dāng)前曲目的開始部分。如果在上一次Prev命令之后三秒之內(nèi)再次執(zhí)行這一命令,那么就定位到上一個曲目的開始部分,如果已經(jīng)處在第一個曲目內(nèi),那么就只是定位到第一個曲目的開始部分。第7頁,課件共62頁,創(chuàng)作于2023年2月命令描述/所用的屬性Notify(False)Wait(True)Next使用Seek命令定位到下一個曲目的開始部分(如果已經(jīng)處在最后一個曲目內(nèi),那么就定位到最后一個曲目的開始部分)。Notify(False)Wait(True)Seek如果沒有進(jìn)行播放,那么就使用MCI_SEEK命令搜索一個位置。如果播放正在進(jìn)行,那么就使用MCI_PLAY命令從給定位置開始繼續(xù)播放。Notify(False)Wait(True)ToRecord使用MCI_RECORD命令進(jìn)行記錄。續(xù)表第8頁,課件共62頁,創(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命令保存打開的文件。Notify(False)Wait(True)FileName續(xù)表第9頁,課件共62頁,創(chuàng)作于2023年2月其中:1)DeviceType屬性:指定要打開的MCI設(shè)備的類型。語法:DeviceType[=device$]

說明:參數(shù)device$是要打開的MCI設(shè)備的類型,例如:AVIVideo、CDAudio、DAT、DigitalVideo、MMMovie、其它、Overlay、掃描儀、序列發(fā)生器、VCR、視盤或WaveAudio。打開簡單設(shè)備(如不使用文件的音頻CD)時,該屬性必須設(shè)置。如果文件的擴(kuò)展名沒有指定將要使用的設(shè)備,打開復(fù)雜MCI設(shè)備時也必須設(shè)置該屬性。2)Wait屬性:決定MultimediaMCI控件是否要等到下一條MCI命令完成,才能將控件返回應(yīng)用程序。在設(shè)計時,該屬性不可用。對該屬性賦值時,只對下一條MCI命令有效。后面的MCI命令會一直忽略Wait屬性,除非用另外一個值(不同的或可標(biāo)識的)為它賦值。第10頁,課件共62頁,創(chuàng)作于2023年2月3)Sharable屬性:決定多個程序能否共享同一臺MCI設(shè)備。若取值為False,表示其它控件或應(yīng)用程序不能訪問這臺設(shè)備;若取值為True,表示多個控件或應(yīng)用程序能夠打開這臺設(shè)備。4)Notify屬性:決定下一條MCI命令是否使用MCI通知服務(wù)。如果被設(shè)置為True,則Notify屬性在下一條MCI命令完成時產(chǎn)生一個回調(diào)事件(Done)。設(shè)計時該屬性不可用。(2)UpdateInterval屬性:規(guī)定兩次連續(xù)的StatusUpdate事件之間的毫秒數(shù)。語法:UpdateInterval[=milliseconds%]

說明:參數(shù)milliseconds%規(guī)定事件之間的毫秒數(shù)。如果毫秒數(shù)是0,表明沒有StatusUpdate事件發(fā)生。第11頁,課件共62頁,創(chuàng)作于2023年2月3.主要事件(1)StatusUpdate事件(MultimediaMCI控件):按UpdateInterval屬性給定的時間間隔自動地發(fā)生。語法:PrivateSubMMControl_StatusUpdate()

說明:該事件允許應(yīng)用程序更新顯示,以通知用戶當(dāng)前MCI設(shè)備的狀態(tài)。應(yīng)用程序可以從Position、Length和Mode等屬性中獲得狀態(tài)信息。(2)Done事件:當(dāng)Notify

屬性為True的MCI

命令結(jié)束時發(fā)生。語法:PrivateSubMMControl_Done(NotifyCodeAsInteger)

說明:參數(shù)NotifyCode表示MCI命令是否成功??梢允潜?1-2中的任意設(shè)置值。第12頁,課件共62頁,創(chuàng)作于2023年2月表11-2參數(shù)NotifyCode的設(shè)置值值設(shè)置值/Result1mciSuccessful命令成功的執(zhí)行。2mciSuperseded命令被其它命令所替代。4mciAborted命令被用戶中斷。8mciFailure命令失敗。第13頁,課件共62頁,創(chuàng)作于2023年2月11.1.2簡單媒體播放器

[例11-1]制作播放WAVMP3mid等音頻文件的播放器。[分析]播放文件一般步驟:設(shè)置設(shè)備打開的屬性;指定播放文件;打開設(shè)備,開始播放;播放完畢,關(guān)閉設(shè)備。[建立工程]新建窗體,命名為frmWAV。向窗體添加一個MCI控件,一個通用對話框控件,四個按鈕,五個label控件,一個文本框控件,界面布局如圖11-2所示。Text1cmdOpenCommonDialog1MMControl1cmdPlaycmdPausecmdCloseLabel2

Label3圖11-2界面布局第14頁,課件共62頁,創(chuàng)作于2023年2月[程序代碼]’打開文件按鈕代碼PrivateSubcmdOpen_Click()'未打開文件前,讓播放\暫停\關(guān)閉按鈕不可用

cmdPlay.Enabled=FalsecmdPause.Enabled=FalsecmdClose.Enabled=False'選擇文件對話框

CommonDialog1.DialogTitle="選擇播放文件"CommonDialog1.Filter="*.wav|*.wav|*.mid|*.mid|*.mp3|*.mp3"CommonDialog1.FileName=""CommonDialog1.ShowOpen

'如果選擇了文件,則設(shè)置MCI屬性

IfCommonDialog1.FileName<>""ThenText1.Text=CommonDialog1.FileName第15頁,課件共62頁,創(chuàng)作于2023年2月

'打開文件前,先停止上一次的播放

MMControl1.Command="close"

MMControl1.FileName=Text1.TextMMControl1.DeviceType=""MMControl1.Command="open"

'顯示文件播放長度

Label2.Caption=ToHMS(MMControl1.Length)

'出發(fā)StatusUpdate事件,在該事件中,得到當(dāng)前播放進(jìn)度

MMControl1.UpdateInterval=100

cmdPlay.Enabled=TrueEndIfEndSub'開始播放PrivateSubcmdPlay_Click()MMControl1.Command="play"cmdPlay.Enabled=FalsecmdPause.Enabled=TruecmdClose.Enabled=TrueEndSub第16頁,課件共62頁,創(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頁,課件共62頁,創(chuàng)作于2023年2月'播放完畢,循環(huán)播放

IfMMControl1.Position>=MMControl1.LengthThenMMControl1.Command="prev"MMControl1.Command="play"EndIfEndSub'轉(zhuǎn)換為時分秒格式FunctionToHMS(TsAsLong)AsStringTs=Ts/1000hh=Ts\3600mm=(TsMod3600)\60ss=(TsMod3600)Mod60

ToHMS=Format(hh,"00")&";"&Format(mm,"00")&";"&Format(ss,"00")EndFunction第18頁,課件共62頁,創(chuàng)作于2023年2月[運行結(jié)果]單擊“打開文件”按鈕,選擇MAVMID或MP3文件后,“播放”按鈕可用;單擊“播放”按鈕,label3將顯示播放進(jìn)度;控制“暫?!被颉巴V埂卑粹o,實現(xiàn)相應(yīng)的操作。顯示效果如圖11-3所示。一般情況下,如果要使用自定義按鈕代替MCI操作按鈕,MCI控件應(yīng)將Visible屬性設(shè)置為false,讓其不可見。圖11-3播放器運行結(jié)果第19頁,課件共62頁,創(chuàng)作于2023年2月11.1.3錄音與放音

[例11-2]通過電腦麥克風(fēng)錄制聲音文件,保存到本機(jī),并回放該文件。[分析]錄制文件的一般步驟如下:設(shè)置設(shè)備打開的屬性;指定錄制文件保存的位置;打開設(shè)備,開始錄制;錄制完畢,保存文件;關(guān)閉設(shè)備。使用MultimediaMCI控件記錄音頻信號之前,應(yīng)打開一個新的文件,以保證記錄聲音的數(shù)據(jù)文件格式與系統(tǒng)記錄格式完全兼容。關(guān)閉MCI設(shè)備前,應(yīng)該發(fā)出MCISave命令,把記錄的數(shù)據(jù)保存到文件中去。第20頁,課件共62頁,創(chuàng)作于2023年2月[建立工程]添加窗體frmRec,向窗體添加MCI控件及四個按鈕控件,分別命名為cmdRec、cmdPause、cmdSave和cmdPlay,如圖11-4所示。[程序代碼]'開始錄音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頁,課件共62頁,創(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界面布局

[運行結(jié)果]如圖11-5所示。第22頁,課件共62頁,創(chuàng)作于2023年2月[運行結(jié)果]如圖11-5所示。圖11-5運行結(jié)果。為代碼簡單起見,未對按鈕之間的操作邏輯進(jìn)行控制。請讀者完善例11-2第23頁,課件共62頁,創(chuàng)作于2023年2月11.2Internet傳輸控件

1.Internet傳輸控件InternetTransfer控件(以下簡稱稱inet控件)支持超文本傳輸協(xié)議(HTTP)和文件傳輸協(xié)議(FTP),它們是Internet網(wǎng)上使用最廣泛的兩種協(xié)議。使用HTTP協(xié)議可以連接全球信息網(wǎng)(WorldWideWeb)服務(wù)器,以檢索HTML文檔。使用FTP協(xié)議可以在FTP服務(wù)器上登錄,以下載和加載文件。UserName和Password屬性可讓用戶在要求驗證身份的私有服務(wù)器上登錄。另外,也可以連接公用的FTP服務(wù)器,并下載文件。Execute方法支持普通的FTP命令,如CD和GET。要使用inet控件,需要在菜單欄上選擇“工程→部件”選項,在“部件”對話框的“控件”選項卡中找到項,添加到工程中。添加后,在工具箱中將出現(xiàn)圖標(biāo)。第24頁,課件共62頁,創(chuàng)作于2023年2月2.主要屬性(1)URL屬性:設(shè)置或返回Execute或OpenURL方法使用的URL。URL屬性至少必須包含一個協(xié)議(FTP或HTTP)和一個遠(yuǎn)程主機(jī)名。URL屬性可以是目錄或文件。例如,下面兩個URLs都是有效的:'設(shè)置URL,僅返回文件目錄:Inet1.URL="HTTP://"'該URL將返回文件的文本:Inet1.URL=HTTP:///disclaimer.txt(2)RequestTimeout屬性:設(shè)置或返回超時截止前按秒計算的等待時間長度。如果請求在指定的時間內(nèi)還沒有響應(yīng),并且該請求使用OpenURL方法(同步地),將產(chǎn)生錯誤;如果請求使用Execute方法,將引發(fā)帶錯誤碼的StateChanged事件。把該屬性設(shè)置為0,則意味著不限定等待時間。(3)Protocol屬性:設(shè)置或返回一個值,指定和Execute方法一起使用的協(xié)議。第25頁,課件共62頁,創(chuàng)作于2023年2月表11-3Protocol的有效設(shè)置值常數(shù)值描述icUnknown0未知的。icDefault1缺省協(xié)議。icFTP2FTP。文件傳輸協(xié)議。icReserved3為將來預(yù)留。icHTTP4HTTP。超文本傳輸協(xié)議。icHTTPS5安全HTTP。第26頁,課件共62頁,創(chuàng)作于2023年2月(4)UserName屬性:設(shè)置或返回與請求一起發(fā)送到遠(yuǎn)程計算機(jī)的名稱。如果該屬性為空,提出請求時該控件將把“anonymous”作為用戶名來發(fā)送。(5)Password屬性:設(shè)置或返回一個密碼,該密碼將和請求一道被發(fā)送,用以在遠(yuǎn)程計算機(jī)上登錄。如果該屬性為空,控件將發(fā)送一個缺省的密碼。第27頁,課件共62頁,創(chuàng)作于2023年2月3.主要方法(1)Execute方法作用:執(zhí)行對遠(yuǎn)程服務(wù)器的請求。只能發(fā)送對特定的協(xié)議有效的請求。語法格式:Executeurl,operation,data,requestHeadersExecute屬性的語法包含以下部分:url:可選,字符串,指定控件將要連接的URL。如果這里未指定URL,將使用URL屬性中指定的URL。Operation:可選,字符串,指定將要執(zhí)行的操作類型。支持的操作列表參見下面的“設(shè)置值”。Data:可選,字符串,指定用于操作的數(shù)據(jù)(參見下面的“設(shè)置值”)。requestHeaders:可選,字符串,指定由遠(yuǎn)程服務(wù)器傳來的附加的標(biāo)頭。格式:headername:headervaluevbCrLf第28頁,課件共62頁,創(chuàng)作于2023年2月(2)OpenURL方法打開并返回指定URL的文檔,文檔以變體型返回。語法格式:OpenUrlurl[,datatype]其中:url:必需的,被檢索文檔的URL。Datatype:可選,整數(shù),如“設(shè)置值”所示,指定數(shù)據(jù)類型。Datatype的設(shè)置值:icString0:缺省值,把數(shù)據(jù)作為字符串來檢索。icByteArray1:把數(shù)據(jù)作為字節(jié)數(shù)組來檢索。4.主要事件Inet控件只有一個事件:StateChanged事件。該事件在連接中狀態(tài)發(fā)生改變時觸發(fā)。事件格式:tateChanged(ByValStateAsInteger)其中,State為整數(shù),取值見表11-4的“設(shè)置值”,用于指定狀態(tài)。第29頁,課件共62頁,創(chuàng)作于2023年2月表11-4State的設(shè)置值常數(shù)值描述icNone0無狀態(tài)可報告。icHostResolvingHost1該控件正在查詢所指定的主機(jī)的IP地址。icHostResolved2該控件已成功地找到所指定的主機(jī)的IP地址。icConnecting3該控件正在與主機(jī)連接。icConnected4該控件已與主機(jī)連接成功。icRequesting5該控件正在向主機(jī)發(fā)送請求。icRequestSent6該控件發(fā)送請求已成功。icReceivingResponse7該控件正在接收主機(jī)的響應(yīng)。icResponseReceived8該控件已成功地接收到主機(jī)的響應(yīng)。icDisconnecting9該控件正在解除與主機(jī)的連接。icDisconnected10該控件已成功地與主機(jī)解除了連接。icError11與主機(jī)通訊時出現(xiàn)了錯誤。icResponseCompleted12該請求已經(jīng)完成,并且所有數(shù)據(jù)均已接收到。第30頁,課件共62頁,創(chuàng)作于2023年2月使用inet控件的一般思路:設(shè)置URL屬性,指定登錄的服務(wù)器;如果登錄的是FTP服務(wù)器,需要指定用戶名和密碼,可以匿名登錄的FTP服務(wù)器無需設(shè)置其UserName和Password屬性。然后通過Execute方法傳遞get命令參數(shù)下載文件;傳遞send命令參數(shù)上傳文件.第31頁,課件共62頁,創(chuàng)作于2023年2月11.2.2利用控件上傳下載文件

[例11-3][分析]要正確運行本例,需要在本地建立FTP服務(wù)器,在FTP服務(wù)器中存放有A6.MP3文件或其它任意文件。此外,也可以指定任意一個實際存在的FTP服務(wù)器,輸入用戶名和密碼進(jìn)行下載和上傳文件。[建立工程]添加三個文本框,分別命名為Dlurl、Dlname、DLpwd,用于輸入服務(wù)器IP地址、用戶名和密碼。添加三個按鈕,分別為下載文件、上傳文件和保存帳號設(shè)置,并重新命名為:cmd_get、cmd_send和cmd_save。界面布局如圖11-4所示。第32頁,課件共62頁,創(chuàng)作于2023年2月cmd_getcmd_sendDLurlDLnameDLpwdlbl_statecmd_save圖11-4界面布局第33頁,課件共62頁,創(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頁,課件共62頁,創(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'下載過程出現(xiàn)錯誤37 GoToendjump38 EndIf39 Wend40 41 Inet1.Execute,"close"'關(guān)閉連接第35頁,課件共62頁,創(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頁,課件共62頁,創(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ā)出請求!"77 Case6:78 state_info="已經(jīng)向服務(wù)器發(fā)出請求!"79 Case7:80 state_info="服務(wù)器收到請求!"81 Case8:82 state_info="服務(wù)器已經(jīng)收到響應(yīng)!正在傳送...."83 Case9:84 state_info="在斷開連接....!"85 Case10:86 state_info="已經(jīng)斷開服務(wù)器!"87 Case11:88 state_info="發(fā)生通訊錯誤!"&Inet1.ResponseInfo89 Case12:90 state_info="向服務(wù)器發(fā)出的請求結(jié)束!傳送完畢!"91 EndSelect92 93 lbl_state.Caption=state_info94 EndSub第37頁,課件共62頁,創(chuàng)作于2023年2月12.3winsock傳輸控件

11.3.1winsock傳輸控件概述利用WinSock控件可以與遠(yuǎn)程計算機(jī)建立連接,并通過用戶數(shù)據(jù)文報協(xié)議(UDP)或者傳輸控制協(xié)議(TCP)進(jìn)行數(shù)據(jù)交換。這兩種協(xié)議都可以用來創(chuàng)建客戶與服務(wù)器應(yīng)用程序。與Timer控件類似,WinSock控件在運行時是不可見的。要使用Winsock控件,需要在菜單欄上選擇“工程→部件”選項,在“部件”對話框的“控件”選項卡中找到項,添加到工程。添加后,在工具箱中將出現(xiàn)圖標(biāo)。第38頁,課件共62頁,創(chuàng)作于2023年2月1.可能的用途(1)創(chuàng)建收集用戶信息的客戶端應(yīng)用程序,并將收集的信息發(fā)送到某中央服務(wù)器。(2)創(chuàng)建一個服務(wù)器應(yīng)用程序,作為多個用戶的數(shù)據(jù)的匯入點。(3)創(chuàng)建“聊天”應(yīng)用程序。2.選擇通訊協(xié)議使用WinSock控件時,首先需要考慮使用什么協(xié)議??梢允褂玫膮f(xié)議包括TCP和UDP。兩種協(xié)議之間的重要區(qū)別在于它們的連接狀態(tài):(1)TCP協(xié)議是基于連接的協(xié)議,可以將它與電話系統(tǒng)相比。開始數(shù)據(jù)傳輸之前,用戶必須先建立連接。(2)UDP協(xié)議是一種無連接協(xié)議,兩臺計算機(jī)之間的傳輸類似于傳遞郵件:消息從一臺計算機(jī)發(fā)送到另一臺計算機(jī),但是兩者之間沒有明確的連接。另外,單次傳輸?shù)淖畲髷?shù)據(jù)量取決于具體的網(wǎng)絡(luò)。具體選擇哪一種協(xié)議,通常由需要創(chuàng)建的應(yīng)用程序決定。下面的幾個問題將有助于選擇適宜的協(xié)議:(1)收發(fā)數(shù)據(jù)時,應(yīng)用程序是否需要得到客戶端或服務(wù)器的確認(rèn)信息?如果需要,使用TCP協(xié)議,在收發(fā)數(shù)據(jù)之前先建立明確的連接。第39頁,課件共62頁,創(chuàng)作于2023年2月(2)數(shù)據(jù)量是否特別大(例如圖象與聲音文件)?建立連接后,TCP協(xié)議將維護(hù)連接并確保數(shù)據(jù)的完整性。不過,這種連接需要更多的計算資源,因而是比較“昂貴”的。(3)數(shù)據(jù)發(fā)送是間歇的,還是在一個會話內(nèi)?例如,如果應(yīng)用程序在某個任務(wù)完成時需要通知某臺計算機(jī),UDP協(xié)議更適宜。UDP協(xié)議適合發(fā)送少量的數(shù)據(jù)。3.協(xié)議的設(shè)置設(shè)計時,可以按以下方式設(shè)置應(yīng)用程序使用的協(xié)議:在“屬性”窗口中單擊“協(xié)議”,然后選擇sckTCPProtocol或者sckUDPProtocol。也可以用程序代碼設(shè)置Protocol屬性,如下所示:Winsock1.Protocol=sckTCPProtocol第40頁,課件共62頁,創(chuàng)作于2023年2月4.主要屬性(1)Protocol:返回或設(shè)置Winsock控件使用的協(xié)議(TCP或UDP協(xié)議)。Protocol屬性的設(shè)置值見表11-5。表11-5protocol屬性的設(shè)置值常數(shù)值描述sckTCPProtocol0缺省的。TCP協(xié)議。sckUDPProtocol1UDP協(xié)議。第41頁,課件共62頁,創(chuàng)作于2023年2月(2)RemoteHost:返回或設(shè)置遠(yuǎn)程計算機(jī),控件向它發(fā)送數(shù)據(jù)或從它那里接收數(shù)據(jù)。既可提供主機(jī)名,如FTP://;也可提供點格式下的IP地址字符串,如“”。(3)RemoteHostIP:返回遠(yuǎn)程主機(jī)的IP地址。若客戶應(yīng)用程序已用Connect方法建立連接,屬性中包含了遠(yuǎn)程機(jī)器的IP字符串。對于服務(wù)器應(yīng)用程序,請求連接(ConnectionRequest事件)后,屬性包含遠(yuǎn)程計算機(jī)的IP地址字符串,該字符串啟動了連接。使用UDP協(xié)議時,在DataArrival事件出現(xiàn)后,屬性包含了發(fā)送UDP數(shù)據(jù)的計算機(jī)的IP地址。(4)LocalHostName:返回本地計算機(jī)名。設(shè)計時是只讀的,而且不可用。(5)LocalIP:返回本地計算機(jī)的IP地址,格式是IP地址加點字符串(xxx.xxx.xxx.xxx)。設(shè)計時是只讀的,而且不可用。第42頁,課件共62頁,創(chuàng)作于2023年2月(6)LocalPort:返回或者設(shè)置所用的本地端口。設(shè)計時是可讀/寫的,而且可用。對客戶來說,該屬性指定發(fā)送數(shù)據(jù)的本地端口。如果應(yīng)用程序不需要特定端口,則指定0為端口號。這種情況下,控件將選擇一個隨機(jī)端口。建立起連接后,該端口是用于TCP連接的本地端口。對于服務(wù)器來說,是用于偵聽的本地端口。如果指定端口0,就使用一個隨機(jī)端口。調(diào)用Listen方法后,屬性包含了已選定的實際端口。(7)BytesReceived:返回接收到的(當(dāng)前在接收端緩沖區(qū)內(nèi)的)數(shù)據(jù)的數(shù)量。使用GetData方法獲取數(shù)據(jù)。設(shè)計時是只讀的,而且不可用。(8)State:返回控件的狀態(tài),用枚舉類型表示。設(shè)計時是只讀的,而且不可用。State屬性的設(shè)置值見表11-6。第43頁,課件共62頁,創(chuàng)作于2023年2月常數(shù)值描述sckClosed0缺省的。關(guān)閉sckOpen1打開sckListening2偵聽sckConnectionPending3連接掛起sckResolvingHost4識別主機(jī)sckHostResolved5已識別主機(jī)sckConnecting6正在連接sckConnected7已連接sckClosing8同級人員正在關(guān)閉連接sckError9錯誤表11-6State屬性的設(shè)置值第44頁,課件共62頁,創(chuàng)作于2023年2月5.主要方法(1)Connect方法:要求連接到遠(yuǎn)程計算機(jī)。說明:想建立TCP連接時,必須調(diào)用Connect方法。語法:ConnectremoteHost,remotePort返回值:無語法說明見表11-7。部分描述remoteHost必需的。要連接的遠(yuǎn)程計算機(jī)的名稱。remotePort要連接的遠(yuǎn)程計算機(jī)的端口。第45頁,課件共62頁,創(chuàng)作于2023年2月(2)Accept方法:僅適用于TCP服務(wù)器應(yīng)用程序。處理ConnectionRequest事件時用這個方法接受新連接。語法:Acceptrequested返回值:無說明:在ConnectionRequest事件中使用Accept方法。ConnectionRequest事件有一個對應(yīng)的參數(shù),即RequestID參數(shù),該參數(shù)應(yīng)該傳給Accept方法。例如:PrivateSubWinsock1_ConnectionRequest(ByValrequestIDAsLong)'測試State屬性,如果當(dāng)前連接是打開的話,則關(guān)閉連接。

IfWinsock1.State<>sckClosedThenWinsock1.Close'將requestID參數(shù)值傳遞給Accept方法。

Winsock1.AcceptrequestedEndSub(3)Listen方法:創(chuàng)建套接字并將其設(shè)置為偵聽模式。該方法僅適用于TCP連接。語法:Listen返回值:無說明:當(dāng)有新連接時,就會出現(xiàn)ConnectionRequest事件。處理ConnectionRequest事件時,應(yīng)用程序應(yīng)該(在一個新的控件示例上)用Accept方法接受連接。第46頁,課件共62頁,創(chuàng)作于2023年2月(4)GetData方法:獲取當(dāng)前的數(shù)據(jù)塊并將其存儲在變體類型的變量中。語法:GetDatadata,[type,][maxLen]語法說明見表11-8。表11-8GetData方法的語法說明部分描述Data在方法成功返回之后存儲獲取數(shù)據(jù)的地方。如果對請求的類型沒有足夠可用的數(shù)據(jù),則將data設(shè)置成Empty。Type可選的。獲取的數(shù)據(jù)類型,如下例“設(shè)置值”所示。maxLen可選的。在接收到字節(jié)數(shù)組或字符串時所需大小。如果對字節(jié)數(shù)組或字符串、參數(shù)丟失、則將獲取所有可用數(shù)據(jù)。如果提供的數(shù)據(jù)類型不是字節(jié)數(shù)組或字符串,則忽略這個參數(shù)。第47頁,課件共62頁,創(chuàng)作于2023年2月type

的設(shè)置值見表11-9。表11-9type

的設(shè)置值描述常數(shù)BytevbByteIntegervbIntegerLongvbLong描述常數(shù)SinglevbSingleDoublevbDoubleCurrencyvbCurrencyDatevbDateBooleanvbBooleanSCODEvbErrorStringvbStringByteArrayvbArray+vbByte第48頁,課件共62頁,創(chuàng)作于2023年2月說明:通常將GetData方法與DataArrival事件并用,而DataArrival事件包含totalBytes參數(shù)。如果指定一個比totalBytes參數(shù)小的maxlen,則將得到警告10040,指出剩余的字節(jié)將丟失。(5)Bind方法:指定用于TCP連接的LocalPort和LocalIP。如果有多協(xié)議適配卡,就用這個方法。語法:Bind

LocalPort,LocalIPBind方法的語法說明見表11-10。表11-10Bind方法的語法說明部分描述LocalPort用來建立連接的端口。LocalIP用來建立連接的本地Internet地址。說明:調(diào)用Listen方法之前,必須調(diào)用Bind方法。第49頁,課件共62頁,創(chuàng)作于2023年2月6.主要事件(1)Connect事件:當(dāng)一個Connect操作完成時發(fā)生。說明:使用Connect事件確認(rèn)已經(jīng)成功建立了一個連接。(2)ConnectionRequest事件:當(dāng)遠(yuǎn)程計算機(jī)請求連接時出現(xiàn)。說明:僅適用于TCP服務(wù)器應(yīng)用程序。請求一個新連接時激活該事件。激活該事件后,RemoteHostIP和RemotePort屬性存儲有關(guān)客戶的信息;服務(wù)器可決定是否接受連接。如果不接受新連接,則同級人員(客戶)將得到Close事件。(在一個新控件示例上)用Accept方法接受新連接。(3)DataArrival事件:當(dāng)新數(shù)據(jù)到達(dá)時出現(xiàn)。說明:如果沒有獲取一個GetData調(diào)用中的全部數(shù)據(jù),則事件不會出現(xiàn)。只有存在新數(shù)據(jù)時才激活該事件??呻S時用BytesReceived屬性檢查可用的數(shù)據(jù)量。(4)SendComplete事件:完成一個發(fā)送操作時出現(xiàn)。(5)Error事件:無論何時,只要后臺處理中出現(xiàn)錯誤(例如連接失敗,或在后臺收發(fā)數(shù)據(jù)失?。录蜁霈F(xiàn)。(6)Close事件:當(dāng)遠(yuǎn)程計算機(jī)關(guān)閉連接時出現(xiàn)。應(yīng)用程序應(yīng)正確使用Close方法關(guān)閉TCP連接。第50頁,課件共62頁,創(chuàng)作于2023年2月11.3.2TCP連接初步

[例11-4]創(chuàng)建一個簡單的TCP服務(wù)器和客戶端。[分析]如果應(yīng)用程序要使用TCP協(xié)議,首先必須決定應(yīng)用程序是服務(wù)器還是客戶端。如果要創(chuàng)建一個服務(wù)器端,則應(yīng)用程序需要“監(jiān)聽”指定的端口。當(dāng)客戶端提出連接請求時,服務(wù)器端能夠接受請求并建立連接。連接建立后,客戶端與服務(wù)器端可以自由地互相通訊。第51頁,課件共62頁,創(chuàng)作于2023年2月1.創(chuàng)建TCP服務(wù)器[建立工程]創(chuàng)建新的StandardEXE工程。將默認(rèn)窗體的名稱改為frmServer。將窗體的標(biāo)題改為“TCP服務(wù)器”。在窗體中放入一個Winsock控件,將其名字改為tcpServer。在窗體上添加兩個TextBox控件,第一個命名為txtSendData,第二個命名txtOutput。[程序代碼]為窗體添加如下的代碼。PrivateSubForm_Load()'將LocalPort屬性設(shè)置為一個整數(shù)。'然后調(diào)用Listen方法。tcpServer.LocalPort=1001tcpServer.ListenfrmClient.Show'顯示客戶端的窗體。EndSubPrivateSubtcpServer_ConnectionRequest_(ByValrequestIDAsLong)第52頁,課件共62頁,創(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ù)時,使用SendData方法'發(fā)送輸入的字符串。tcpServer.SendDatatxtSendData.TextEndSubPrivateSubtcpServer_DataArrival_(ByValbytesTotalAsLong)第53頁,課件共62頁,創(chuàng)作于2023年2月'為進(jìn)入的數(shù)據(jù)聲明一個變量。'調(diào)用GetData方法,并將數(shù)據(jù)賦予名為txtOutput'的TextBox的Text屬性。DimstrDataAsStringtcpServer.GetDatastrDatatxtOutput.Text=strDataEndSub說明:以上步驟創(chuàng)建了一個簡單的服務(wù)器應(yīng)用程序。為了使它能夠工作,還必須為它創(chuàng)建一個客戶端的應(yīng)用程序。第54頁,課件共62頁,創(chuàng)作于2023年2月2.創(chuàng)建TCP客戶端[建立工程]在工程中添加一個新的窗體,將其命名為frmClient。將窗體的標(biāo)題改為“TCPClient”。在窗體中添加一個Winsock控件,并將其命名為tcpClient。在frmClient中添加兩個TextBox控件。將第一個命名為txtSend,第二個為txtOutput。在窗體上放一個CommandButton控件,并將其命名為cmdConnect。將CommandButton控件的標(biāo)題改為Connect。[程序代碼]在窗體中添加如下的代碼。第55頁,課件共62頁,創(chuàng)作于2023年2月注意:必須將RemoteHost屬性值修改為計算機(jī)名。PrivateSubForm_Load()'Winsock控件的名字為tcpClient。

'注意:要指定遠(yuǎn)程主機(jī),可以使用

'IP地址(例如:""),也可以使用

'計算機(jī)的“好聽的名字”如下所示。

tcpClient.RemoteHost="RemoteComputerName"tcpClient.RemotePort=1001EndSubPrivateSubcmdConnect_Click()'調(diào)用Connect方法,初始化連接。

tcpClient.ConnectEndSubPrivateSubtxtSendData_Change()tcpClient.SendDatatxtSend.TextEndSubPrivateSubtcpClient_DataArrival_(ByValbytesTotalAsLong)DimstrDataAsStringtcpClient.GetDatastrDatatxtOutput.Te

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論