




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、北京郵電大學(xué)多媒體通信專業(yè)綜合實(shí)驗(yàn)多媒體通信專業(yè)綜合實(shí)驗(yàn)報(bào)告題目:窄帶話音調(diào)頻發(fā)送與接收系統(tǒng)班級(jí):組員: 學(xué)號(hào): 目錄一、課程目的1二、實(shí)驗(yàn)要求11.基本要求12.提高要求1三、實(shí)驗(yàn)分工11.發(fā)送端42.接收端2四、背景知識(shí)21.關(guān)于聲卡技術(shù)22.關(guān)于窄帶調(diào)頻與解調(diào)技術(shù)23.關(guān)于語音文件格式及播放軟件3五、核心技術(shù)31. WAV32角度調(diào)制4六、實(shí)驗(yàn)功能實(shí)現(xiàn)51.實(shí)驗(yàn)思路52.實(shí)驗(yàn)步驟及結(jié)果61)測(cè)試發(fā)送端62)接收端準(zhǔn)備工作93)接收與發(fā)送的傳輸實(shí)現(xiàn)103.源代碼124.結(jié)果分析14七、功能提高與改善151實(shí)驗(yàn)原理152實(shí)驗(yàn)環(huán)境163設(shè)計(jì)思路及源代碼164實(shí)驗(yàn)結(jié)果及分析37八、實(shí)驗(yàn)總結(jié)及心得
2、38一、課程目的1希望通過本課的實(shí)踐能夠?qū)⑺鶎W(xué)理論課,通過綜合設(shè)計(jì)的教學(xué)實(shí)踐等環(huán)節(jié)有機(jī)的結(jié)合起來,達(dá)到提升綜合設(shè)計(jì)能力的;2熟悉WINDOWS或LINUX操作系統(tǒng)的基本架構(gòu)下聲卡/USB攝像頭的驅(qū)動(dòng)程序以及在多媒體語音通信中的應(yīng)用;3掌握數(shù)字信號(hào)處理技術(shù)在音頻/視頻信號(hào)處理及通信中的應(yīng)用,通過讀取生成的數(shù)據(jù)文件完成對(duì)信號(hào)的處理,生成數(shù)據(jù)文件并通過播放器回放。二、實(shí)驗(yàn)要求1.基本要求1)語音頻范圍300HZ-3.4kHZ;數(shù)字信號(hào)采樣速率48kHZ,載波:10kHZ,最大頻偏5kHZ2)用C語言(VC)產(chǎn)生8s的音頻數(shù)據(jù),為標(biāo)準(zhǔn)音A(440HZ)開始的8度音,生成wav格式的調(diào)頻數(shù)據(jù)3)通過讀取
3、wav文件對(duì)其進(jìn)行解調(diào)進(jìn)行實(shí)時(shí)回放2.提高要求發(fā)端實(shí)時(shí)采集語音信號(hào)壓縮、處理后變成變成UDP數(shù)據(jù)包通過網(wǎng)絡(luò)發(fā)出,接收端實(shí)時(shí)接收。三、實(shí)驗(yàn)分工1.發(fā)送端蘭天宇 負(fù)責(zé):八度音信號(hào)的產(chǎn)生、調(diào)制以及WAV文件的生成、發(fā)送。2.接收端師圣蔓負(fù)責(zé):WAV文件的接收、解調(diào)、用聲卡播放音頻;實(shí)現(xiàn)音頻的實(shí)時(shí)傳輸。共同查閱相關(guān)資料,學(xué)習(xí)編程知識(shí),進(jìn)行各種調(diào)試,討論交流實(shí)現(xiàn)功能并最終完成實(shí)驗(yàn)報(bào)告的撰寫。四、背景知識(shí)1.關(guān)于聲卡技術(shù)聲卡是將話筒或線性輸入的聲音信號(hào)經(jīng)過模/數(shù)轉(zhuǎn)換編程數(shù)字音頻信號(hào)進(jìn)行數(shù)據(jù)處理,然后再經(jīng)過數(shù)/模轉(zhuǎn)換變成模擬信號(hào),送往混音器中放大,最后輸出驅(qū)動(dòng)揚(yáng)聲器發(fā)聲。聲卡同時(shí)具有A/D和D/A轉(zhuǎn)換功能,
4、將聲卡作為數(shù)據(jù)采集的A/D轉(zhuǎn)換裝置無疑是一個(gè)經(jīng)濟(jì)、方便的選擇。聲卡在windows環(huán)境下具有數(shù)據(jù)采集功能,但系統(tǒng)的功能受到編程語言的限制,數(shù)據(jù)分析與處理的功能非常有限。例如,為了對(duì)采集的數(shù)據(jù)進(jìn)行功率譜分析,則需要用VB或C語言來編寫功率譜分析的子程序,這顯然增加了開發(fā)以聲卡為數(shù)據(jù)采集硬件的數(shù)據(jù)采集系統(tǒng)的難度,并且也不利于分析功能的進(jìn)一步擴(kuò)展。2.關(guān)于窄帶調(diào)頻與解調(diào)技術(shù)角度調(diào)制是原調(diào)制信號(hào)頻譜的非線性搬移,并且產(chǎn)生了新的頻譜分量,所以又稱為非線性調(diào)制。FM(調(diào)頻)在實(shí)際通信中的應(yīng)用非常廣泛,高保真音樂廣播、電視伴音信號(hào)傳輸、蜂窩電話以及衛(wèi)星通信等。與幅度調(diào)制相比,F(xiàn)M可以獲得較高的抗噪聲性能。窄
5、帶調(diào)頻是FM的一種特殊情況。窄帶調(diào)頻可以由乘法器實(shí)現(xiàn),則可用相干解調(diào)的方法來回復(fù)原調(diào)制信號(hào)。在本實(shí)驗(yàn)中八度音的頻率為:fs1=262Hz;fs2=294 Hz;fs3=330 Hz;fs4=349 Hz;fs5=392 Hz;fs6=440 Hz;fs7=494 Hz;fs8=523 Hz;3.關(guān)于語音文件格式及播放軟件音頻文件通常分為兩類:聲音文件和MlDl文件。聲音文件可以分為CD、WAV文件、AlFF文件、Audio文件、Sound文件、MPEG音頻文件。不同格式壓縮算法不同,效果也不同。五、核心技術(shù)1. WAV1)WAV的生成來源于對(duì)聲音模擬波形的采樣。用不同的采樣頻率對(duì)聲音的模擬波形
6、進(jìn)行采樣可以得到一系列離散的采樣點(diǎn),以不同的量化位數(shù)(8 位或 16 位)把這些采樣點(diǎn)的值轉(zhuǎn)換成二進(jìn)制數(shù),然后存入磁盤,這就產(chǎn)生了聲音的 WAV 文件,即波形文件。2)WAV 文件結(jié)構(gòu)WAV文件由若干 chunk(塊)組成。每一個(gè)塊由各自的辨識(shí)碼和塊大小信息為起始。 3)WAV的數(shù)據(jù)塊以及辨識(shí)碼RIFF 是英文 Resource Interchange File Format 的縮寫,是 wave 文件所使用的標(biāo)準(zhǔn)格式,作為 WAV 文件的開頭,緊接其后的是描述文件總大小的四字節(jié) 32 位二進(jìn)制數(shù)據(jù)。 WAVE辨識(shí)碼。WAVE是錄音時(shí)用的標(biāo)準(zhǔn)的WINDOWS文件格式,文件的擴(kuò)展名為“WAV”。
7、 WAVE是 WAV 文件的格式說明。Fmt 塊包含波形文件的大小、采樣頻率、采樣位、聲道數(shù)、編碼格式等重要信息。描述了文件全部的基本參數(shù)。 Data 塊包以辨識(shí)碼 data 開頭,后接 4 字節(jié)數(shù)據(jù)表示數(shù)據(jù)塊大小,存儲(chǔ)了全部的波形采樣數(shù)據(jù)。其中數(shù)據(jù)的排列與采樣位數(shù)、聲道數(shù)有密切關(guān)聯(lián)。4)WAV文件的創(chuàng)建(寫入): 先確定所需創(chuàng)建的文件的聲道數(shù)、采樣頻率、位數(shù)、波形參數(shù)等信息,依據(jù) WAV 文件各個(gè)參數(shù)之間的 關(guān)系計(jì)算得到文件的總大小、數(shù)據(jù)塊大小以及 data 塊內(nèi)的一系列信息,將所得全部信息按照 WAV 文件 存儲(chǔ)格式分別轉(zhuǎn)換后存入各個(gè)信息所屬的數(shù)組中,然后依次寫入到被創(chuàng)建的文件里,得到所需
8、波形文件。5)WAV文件的讀取: 根據(jù) WAV 文件內(nèi)容的存儲(chǔ)順序和所占空間,依次讀取指定的字節(jié)數(shù)并將信息存入相應(yīng)的數(shù)組中。再將各個(gè)數(shù)組中的信息轉(zhuǎn)換為便于識(shí)別和處理的數(shù)據(jù)存入相應(yīng)變量中。6)WAV文件的實(shí)現(xiàn)2角度調(diào)制1)調(diào)制原理角度調(diào)制信號(hào)的一般表達(dá)式為: (1)所謂頻率調(diào)制(FM)指瞬時(shí)頻率偏移隨調(diào)制信號(hào)f(t)成比例的變化,即: (2)式中:稱調(diào)頻靈敏度。這時(shí),相位偏移為: (3)代入式(1)得到FM信號(hào)表達(dá)式為: (4)如果FM信號(hào)的瞬時(shí)相位偏移滿足下式: (5)此時(shí),F(xiàn)M信號(hào)的頻譜寬度比較窄,稱之為窄帶調(diào)頻。將FM表達(dá)式展開得到: (6)當(dāng)為窄帶調(diào)頻即滿足式(5)的條件時(shí),有:所以,式
9、(6)可化簡(jiǎn)為: (7)至此,得到窄帶調(diào)頻的一般表達(dá)式。以式(7)作為數(shù)學(xué)模型,可直接建立窄帶調(diào)頻的原理框圖,2)解調(diào)原理用相干解調(diào)的方法,NBFM信號(hào)在接收端首先經(jīng)過帶通濾波器(BP)濾除頻帶外信道加性噪聲,然后經(jīng)過乘法器與載波(-sinct)相乘,用低通濾波器濾除乘出來的高頻分量,最后經(jīng)微分器去掉f(t)外面的積分,在輸出端恢復(fù)原調(diào)制信號(hào)。下面是解調(diào)框圖。六、實(shí)驗(yàn)功能實(shí)現(xiàn)1.實(shí)驗(yàn)思路利用聲卡的 A/ D 、D/ A 技術(shù)和 MATLAB 的方便編程及可視化功能,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的窄帶話音調(diào)頻發(fā)送與接收系統(tǒng)。該方案具有信號(hào)采集過程簡(jiǎn)單、編程處理方便、界面友好、擴(kuò)展性強(qiáng)、性能穩(wěn)定等特點(diǎn)。用Mat
10、lab分別編寫發(fā)送和接收程序,在發(fā)送程序中根據(jù)八度音頻不同音階的頻率用fprintf()函數(shù)生成八度音頻信號(hào),根據(jù)調(diào)頻原理用規(guī)定的載波10kHZ和最大頻偏5kHZ生成調(diào)制信號(hào),接下來根據(jù)規(guī)定的數(shù)據(jù)采樣頻率48kHZ用wavwrite()函數(shù)分別生成原始音頻信號(hào)和調(diào)制信號(hào)的WAV文件,使用wavplay()函數(shù)播放WAV文件。在接收程序中,使用wavrecord()函數(shù)記錄下音頻連接線傳送的調(diào)制信號(hào),使用demod()函數(shù),根據(jù)相應(yīng)的調(diào)頻參數(shù)進(jìn)行解調(diào),同時(shí)用wavwrite()函數(shù)生成調(diào)制信號(hào)和解調(diào)后信號(hào)的WAV文件,使用sound()函數(shù)播放解調(diào)后的音頻信號(hào)。在實(shí)驗(yàn)中,將兩臺(tái)電腦用音頻連接線相
11、連,同時(shí)運(yùn)行發(fā)送和接收程序,便可實(shí)現(xiàn)音頻信號(hào)在兩臺(tái)電腦間的傳輸。立體聲插頭音頻連接線如下圖:2.實(shí)驗(yàn)步驟及結(jié)果1)測(cè)試發(fā)送端在發(fā)送端電腦上新建兩個(gè)文件夾,路徑分別為D:sendsendcarryD:sendsendsignal 截圖如下:運(yùn)行發(fā)送程序send.m電腦上播放8s八度音頻,同時(shí)在新建的兩個(gè)文件夾中分別生成八度音頻的WAV文件signal.wav和FM調(diào)制后的WAV音頻文件carry.wav,WAV文件數(shù)字信號(hào)采樣速率48kHZ,調(diào)頻載波10kHZ,最大頻偏5kHZ。結(jié)果如下圖:分別用播放器播放signal.wav和carry.wav可以聽到完整的八度音頻和調(diào)制到高頻較為尖銳的八度音
12、頻。用MATLAB生成的原始信號(hào)和調(diào)制信號(hào)的波形如下圖:2)接收端準(zhǔn)備工作在接收端電腦上新建文件夾,路徑分別為D:receivecarryD: receive signal 截圖如下:3)接收與發(fā)送的傳輸實(shí)現(xiàn) 用立體聲插頭音頻連接線將發(fā)送端和接收端的電腦連接起來,在兩臺(tái)電腦上同時(shí)按發(fā)送程序send.m和接收程序receive.m的運(yùn)行按鈕,可以聽到發(fā)送端電腦先播放八度音頻信號(hào),經(jīng)過8秒左右的時(shí)延接收端電腦開始播放接收到的解調(diào)后的八度音頻,與發(fā)送端的信號(hào)基本一致。同時(shí)在接收端的新建文件夾中生成接收到的調(diào)制WAV文件carry.wav和解調(diào)后的WAV文件signal.wav,可以播放。如下圖: 3
13、.源代碼發(fā)送端:Send.m%fp=input('輸入采樣頻率:');fp=48000;fprintf('采樣頻率為:%5d Hzn',fp);%fc=input('輸入載波頻率:');fc=10000;fprintf('載波頻率為:%5d Hzn',fc);%fk=input('輸入頻偏:');fk=5000;fprintf('輸入頻偏為:%5d Hzn',fk);%fs1=input('輸入第1S頻率:');%fs2=input('輸入第2S頻率:');%fs3=
14、input('輸入第3S頻率:');%fs4=input('輸入第4S頻率:');%fs5=input('輸入第5S頻率:');%fs6=input('輸入第6S頻率:');%fs7=input('輸入第7S頻率:');%fs8=input('輸入第8S頻率:');fs1=262;fs2=294;fs3=330;fs4=349;fs5=392;fs6=440;fs7=494;fs8=523;fprintf('第1S頻率:%7d Hzn',fs1);fprintf('第2S頻率
15、:%7d Hzn',fs2);fprintf('第3S頻率:%7d Hzn',fs3);fprintf('第4S頻率:%7d Hzn',fs4);fprintf('第5S頻率:%7d Hzn',fs5);fprintf('第6S頻率:%7d Hzn',fs6);fprintf('第7S頻率:%7d Hzn',fs7);fprintf('第8S頻率:%7d Hzn',fs8);pathsignal='D:sendsendsignalsignal.wav'pathcarry=
16、39;D:sendsendcarrycarry.wav'fprintf('信號(hào)保存地址為: %sn',pathsignal);fprintf('載波保存地址為: %sn',pathcarry);dt=1/fp;t=0:dt:8;st=cos(2*pi*fs1*t).*(t>=0 & t<1) + cos(2*pi*fs2*t).*(t>=1 & t<2) + cos(2*pi*fs3*t).*(t>=2 & t<3)+ cos(2*pi*fs4*t).*(t>=3 & t<4
17、) + cos(2*pi*fs5*t).*(t>=4 & t<5)+ cos(2*pi*fs6*t).*(t>=5 & t<6)+ cos(2*pi*fs7*t).*(t>=6 & t<7) + cos(2*pi*fs8*t).*(t>=7 & t<8);%subplot(2,1,1);%linspace(0,0.001,1000);%plot(t,st);%sound(st,fp);subplot(211)plot(t,st)axis(0 0.05 -2 2)xlabel('Time')title
18、('原始信號(hào)')wavwrite(st,fp,16,pathsignal);st2=fk/fs1*sin(2*pi*fs1*t).*(t>=0 & t<1) + fk/fs2*sin(2*pi*fs2*t).*(t>=1 & t<2) + fk/fs3*sin(2*pi*fs3*t).*(t>=2 & t<3)+ fk/fs4*sin(2*pi*fs4*t).*(t>=3 & t<4) + fk/fs5*sin(2*pi*fs5*t).*(t>=4 & t<5)+ fk/fs6*
19、sin(2*pi*fs6*t).*(t>=5 & t<6)+ fk/fs7*sin(2*pi*fs7*t).*(t>=6 & t<7) + fk/fs8*sin(2*pi*fs8*t).*(t>=7 & t<8);fm=cos(2*pi*fc*t+st2);%subplot(2,1,2);%plot(t,fm);subplot(212)plot(t,fm)axis(0 0.05 -2 2)xlabel('Time')title('調(diào)制后信號(hào)')wavwrite(fm,fp,16,pathcarry);w
20、avplay(fm,fp); 接收端:Receive.m%fs=48000;clear allts=9;%wavplay(wavrecord(ts*fs,fs),fs);fp=48000;bit=16;fc=10000;pathcarry='D:recivecarrycarry.wav'pathsignal='D:recivesignalsignal.wav'fprintf('載波保存地址為: %sn',pathcarry);fprintf('信號(hào)保存地址為: %sn',pathsignal);y=wavrecord(ts*fp,
21、fp);wavwrite(y,fp,pathcarry);yy=demod(y,fc,fp,'fm');wavwrite(yy,fp,pathsignal);sound(yy,fp);4.結(jié)果分析實(shí)驗(yàn)通過MATLAB實(shí)現(xiàn)了八度音頻的生成調(diào)頻、WAV文件的生成、發(fā)送、接收以及解調(diào)播放。實(shí)現(xiàn)了兩臺(tái)電腦間音頻信號(hào)的傳輸。實(shí)驗(yàn)中我們也遇到一些問題,在前期測(cè)試階段,我們將兩臺(tái)電腦靠近,通過發(fā)送端喇叭對(duì)準(zhǔn)接收端的話筒方式進(jìn)行信號(hào)的傳輸,結(jié)果噪聲較大,且不穩(wěn)定,觀測(cè)效果非常不明顯。后期我們買了音頻連接線將兩臺(tái)電腦連接,能夠較好的實(shí)現(xiàn)音頻信號(hào)的高質(zhì)量傳輸,改進(jìn)后信號(hào)穩(wěn)定清晰,很好地實(shí)現(xiàn)了預(yù)想的
22、功能。 同時(shí)我們的實(shí)驗(yàn)也存在很多不足,傳輸過程中存在較長(zhǎng)的時(shí)延,而且不能實(shí)現(xiàn)實(shí)時(shí)傳輸,在接下來的工作中我們考慮用新的方式來完成實(shí)時(shí)傳輸?shù)墓δ?,使用了C#和MATLAB的混合編程,將在第七部分詳述。七、功能提高與改善1實(shí)驗(yàn)原理C#調(diào)用MATLAB1)Matlab精通各種數(shù)值計(jì)算和算法,但是沒有優(yōu)美的界面,且不能對(duì)數(shù)據(jù)庫(kù)訪問操作,對(duì)數(shù)據(jù)有很好的操作能力。Visual studio(C#)擁有完美的界面編程,窗口或網(wǎng)絡(luò)編程以及優(yōu)越的數(shù)據(jù)庫(kù)訪問等優(yōu)勢(shì),對(duì)WAV文件操作很簡(jiǎn)單。2)C#與matlab混合變成可以分成兩種形式:1、matlab生成dll文件供C#調(diào)用2、C#生成dll文件供matlab調(diào)用
23、和matlab直接調(diào)用.NET我們采用第一種方式3)步驟實(shí)現(xiàn)1、創(chuàng)建一個(gè)簡(jiǎn)單的.m文件2、使用Matlab DeployTool生成.Net組件3、創(chuàng)建一個(gè)測(cè)試用的Windows應(yīng)用程序,將其命名為MatlabTest,5、添加對(duì)Matlab生成的twice.dll的引用。6、添加窗體中相應(yīng)的組件4、添加對(duì)MWArray.dll的引用7、編寫相應(yīng)的后臺(tái)代碼8、執(zhí)行并查看結(jié)果實(shí)驗(yàn)中,在數(shù)據(jù)處理部分即核心的調(diào)制解調(diào)使用MATLAB實(shí)現(xiàn),使用C#進(jìn)行人工交互界面。TCP實(shí)現(xiàn)音頻的網(wǎng)絡(luò)實(shí)時(shí)傳輸在以太網(wǎng)上的TCP/IP協(xié)議下對(duì)多媒體信息音頻進(jìn)行實(shí)時(shí)傳輸和同步. TCP/IP是Internet的基礎(chǔ)協(xié)議,
24、也是一種電腦數(shù)據(jù)打包和尋址的標(biāo)準(zhǔn)方法。1) UDP 源端口(16)目標(biāo)端口(16)序號(hào)(32)應(yīng)答號(hào)(32)頭長(zhǎng)度(4)保留(6)編碼位(6)窗口(16)校驗(yàn)和(16)緊急(16)可選項(xiàng)(如果有,0或32)數(shù)據(jù)(可變)源端口(16)目標(biāo)端口(16)報(bào)文長(zhǎng)度(16)校驗(yàn)和(16)數(shù)據(jù)(可變)UDP為應(yīng)用程序提供的是一種不可靠的、無連接的分組交付,因此,UDP報(bào)文可能會(huì)出現(xiàn)丟失、亂序、重復(fù)、延時(shí)等問題。2)UDP的局限性UDP為應(yīng)用程序提供的是一種無連接、不可靠的分組交付。當(dāng)網(wǎng)絡(luò)硬件失效或者負(fù)擔(dān)太重時(shí),數(shù)據(jù)包可能就會(huì)產(chǎn)生丟失、重復(fù)、延時(shí)、亂序的現(xiàn)象。這些都會(huì)導(dǎo)致我們的通信不正常。如果讓應(yīng)用程序來?yè)?dān)
25、負(fù)差錯(cuò)控制的工作,無疑將給程序員帶來許多復(fù)雜的工作,于是,我們使用獨(dú)立的通信協(xié)議來保證通信的可靠性是非常必要的。3) 傳輸控制協(xié)議TCP是一個(gè)面向鏈接的、可靠的通信協(xié)議。1.在開始傳輸前,需要進(jìn)行三次握手建立鏈接2.可靠性:在傳輸過程中,通信雙方的協(xié)議模塊繼續(xù)進(jìn)行通信3. 通信結(jié)束后,通信雙方都會(huì)使用改進(jìn)的三次握手來關(guān)閉鏈接2實(shí)驗(yàn)環(huán)境64位 Windows7系統(tǒng)32位 Matlab2009b64位Visual Studio20103設(shè)計(jì)思路及源代碼1)發(fā)送(客戶端)在運(yùn)行客戶端的程序輸入服務(wù)器的IP和端口,即可連接上。根據(jù)C#中使用TCP協(xié)議的要求設(shè)置相應(yīng)的參數(shù)進(jìn)行數(shù)據(jù)包的發(fā)送??蛻?/p>
26、端的過程分為以下幾個(gè)步驟:(1) 初始化套接字的版本信息WSAStartup;(2) 創(chuàng)建套接字(socket)用于連接服務(wù)器端;(3) 與服務(wù)器進(jìn)行連接Connect;(4) 設(shè)置循環(huán)狀態(tài),進(jìn)行接收和發(fā)送(recv和send);(5) 關(guān)閉套接字(closesocket);源代碼:Net.csusing System;using System.Net;using System.Net.Sockets;using System.IO;namespace sever / <summary> / Net : 提供靜態(tài)方法,對(duì)常用的網(wǎng)絡(luò)操作進(jìn)行封裝 / </summary>
27、public sealed class Net private Net() / <summary> / 向遠(yuǎn)程主機(jī)發(fā)送數(shù)據(jù) / </summary> / <param name="socket">要發(fā)送數(shù)據(jù)且已經(jīng)連接到遠(yuǎn)程主機(jī)的 Socket</param> / <param name="buffer">待發(fā)送的數(shù)據(jù)</param> / <param name="outTime">發(fā)送數(shù)據(jù)的超時(shí)時(shí)間,以秒為單位,可以精確到微秒</param>
28、; / <returns>0:發(fā)送數(shù)據(jù)成功;-1:超時(shí);-2:發(fā)送數(shù)據(jù)出現(xiàn)錯(cuò)誤;-3:發(fā)送數(shù)據(jù)時(shí)出現(xiàn)異常</returns> / <remarks > / 當(dāng) outTime 指定為-1時(shí),將一直等待直到有數(shù)據(jù)需要發(fā)送 / </remarks> public static int SendData(Socket socket, byte buffer, int outTime) if (socket = null | socket.Connected = false) throw new ArgumentException("參數(shù)soc
29、ket 為null,或者未連接到遠(yuǎn)程計(jì)算機(jī)"); if (buffer = null | buffer.Length = 0) throw new ArgumentException("參數(shù)buffer 為null ,或者長(zhǎng)度為 0"); int flag = 0; try int left = buffer.Length; int sndLen = 0; while (true) if (socket.Poll(outTime * 100, SelectMode.SelectWrite) = true) / 收集了足夠多的傳出數(shù)據(jù)后開始發(fā)送 sndLen = s
30、ocket.Send(buffer, sndLen, left, SocketFlags.None); left -= sndLen; if (left = 0) / 數(shù)據(jù)已經(jīng)全部發(fā)送 flag = 0; break; else if (sndLen > 0) / 數(shù)據(jù)部分已經(jīng)被發(fā)送 continue; else / 發(fā)送數(shù)據(jù)發(fā)生錯(cuò)誤 flag = -2; break; else / 超時(shí)退出 flag = -1; break; catch (SocketException e) flag = -3; return flag; / <summary> / 向遠(yuǎn)程主機(jī)發(fā)送文件
31、/ </summary> / <param name="socket" >要發(fā)送數(shù)據(jù)且已經(jīng)連接到遠(yuǎn)程主機(jī)的 socket</param> / <param name="fileName">待發(fā)送的文件名稱</param> / <param name="maxBufferLength">文件發(fā)送時(shí)的緩沖區(qū)大小</param> / <param name="outTime">發(fā)送緩沖區(qū)中的數(shù)據(jù)的超時(shí)時(shí)間</param&
32、gt; / <returns>0:發(fā)送文件成功;-1:超時(shí);-2:發(fā)送文件出現(xiàn)錯(cuò)誤;-3:發(fā)送文件出現(xiàn)異常;-4:讀取待發(fā)送文件發(fā)生錯(cuò)誤</returns> / <remarks > / 當(dāng) outTime 指定為-1時(shí),將一直等待直到有數(shù)據(jù)需要發(fā)送 / </remarks> public static int SendFile(Socket socket, string fileName, int maxBufferLength, int outTime) if (fileName = null | maxBufferLength <=
33、0) throw new ArgumentException("待發(fā)送的文件名稱為空或發(fā)送緩沖區(qū)的大小設(shè)置不正確."); int flag = 0; try FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); long fileLen = fs.Length; / 文件長(zhǎng)度 long leftLen = fileLen; / 未讀取部分 int readLen = 0; / 已讀取部分 byte buffer = null; if (fileLen <= maxBuffer
34、Length) /* 文件可以一次讀取*/ buffer = new bytefileLen; readLen = fs.Read(buffer, 0, (int)fileLen); flag = SendData(socket, buffer, outTime); else /* 循環(huán)讀取文件,并發(fā)送 */ while (leftLen != 0) if (leftLen < maxBufferLength) buffer = new byteleftLen; readLen = fs.Read(buffer, 0, Convert.ToInt32(leftLen); else buf
35、fer = new bytemaxBufferLength; readLen = fs.Read(buffer, 0, maxBufferLength); if (flag = SendData(socket, buffer, outTime) < 0) break; leftLen -= readLen; fs.Flush(); fs.Close(); catch (IOException e) flag = -4; return flag; Program.csusing System;using System.Collections.Generic;using System.Lin
36、q;using System.Windows.Forms;namespace sever static class Program / <summary> / 應(yīng)用程序的主入口點(diǎn)。 / </summary> STAThread static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(); Form1.csusing System;using System.Coll
37、ections.Generic;using System.ComponentModel;using System.Data;using System.IO;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;namespace sever public partial class Form1 : Form Socket socketClient; public Form1() Initialize
38、Component(); private void button1_Click(object sender, EventArgs e) TcpClient client = new TcpClient(); client.Connect(IPAddress.Parse(txtIp.Text), int.Parse(txtPort.Text); NetworkStream ns = client.GetStream(); FileStream fs = new FileStream(txtFileName.Text, FileMode.Open); int size = 0;/初始化讀取的流量為
39、0 long len = 0;/初始化已經(jīng)讀取的流量 while (len < fs.Length) byte buffer = new byte512; size = fs.Read(buffer, 0, buffer.Length); ns.Write(buffer, 0, size); len += size; /Pro(long)len); fs.Flush(); ns.Flush(); fs.Close(); ns.Close(); /ShowMgs(txtFileName.Text + "文件發(fā)送成功"); public void ReceiveMsg()
40、 while (true) try int size = 0; int len = 0; TcpClient client = TCPListener.AcceptTcpClient(); if (client.Connected) /向列表控件中添加一個(gè)客戶端的Ip和端口,作為發(fā)送時(shí)客戶的唯一標(biāo)識(shí) /listbOnline.Items.Add(client.Client.RemoteEndPoint); /ShwMsgForView.ShwMsgforView(lstbxMsgView, "客戶端連接成功" + client.Client.RemoteEndPoint.T
41、oString(); NetworkStream stream = client.GetStream(); if (stream != null) SaveFileDialog sfd = new SaveFileDialog(); if (sfd.ShowDialog(this) = System.Windows.Forms.DialogResult.OK) string fileSavePath = sfd.FileName;/獲得用戶保存文件的路徑 FileStream fs = new FileStream(fileSavePath, FileMode.Create, FileAcce
42、ss.Write); byte buffer = new byte512; while (size = stream.Read(buffer, 0, buffer.Length) > 0) fs.Write(buffer, 0, size); len += size; fs.Flush(); stream.Flush(); stream.Close(); client.Close(); /ShwMsgForView.ShwMsgforView(lstbxMsgView, "文件接受成功" + fileSavePath); catch (Exception ex) /
43、ShwMsgForView.ShwMsgforView(lstbxMsgView, "出現(xiàn)異常:" + ex.Message); private void button2_Click(object sender, EventArgs e) OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK) txtFileName.Text = ofd.FileName; private void button3_Click(object
44、 sender, EventArgs e) int i = Net.SendFile(socketClient, txtFileName.Text, 512, 1); if (i = 0) /ShowMgs(txtFileName.Text + "文件發(fā)送成功"); socketClient.Close(); /ShowMgs("連接關(guān)閉"); else /ShowMgs(txtFileName.Text + "文件發(fā)送失敗,i=" + i); 2)接收(服務(wù)器)時(shí)刻監(jiān)聽發(fā)送過來的數(shù)據(jù),與發(fā)送端相對(duì)應(yīng),根據(jù)TCP協(xié)議設(shè)置相應(yīng)的參數(shù),完成數(shù)據(jù)包的接收,實(shí)現(xiàn)發(fā)送與接收的實(shí)時(shí)性。服務(wù)器端的過程可以分為以下幾個(gè)步驟: (1) 初始化套接字的版本信息WSAStartup;(2)創(chuàng)建套接字,需要兩個(gè)套接字及客戶端和服務(wù)器端的套接字;(3)綁定服務(wù)器(bind),該函數(shù)用于綁定服務(wù)器套接字;(4)監(jiān)聽服務(wù)器(listen),該函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保潔與員工合同范本
- 住宅加裝電梯工程合同范例
- 出售尼龍水箱合同范本
- 與政府合作合同范本
- 內(nèi)控合同范本
- 協(xié)商撤銷合同范例
- 勞動(dòng)合同范本 病假
- 單位租住房合同范本
- 個(gè)人蓋房合同范本
- 中醫(yī)醫(yī)聯(lián)體合同范本
- PPT用中國(guó)地圖(可編輯)
- 基于德育的農(nóng)村中小學(xué)校園欺凌現(xiàn)象的解決對(duì)策優(yōu)秀獲獎(jiǎng)科研論文
- 鐵路工程概預(yù)算-工程經(jīng)濟(jì)管理培訓(xùn)-課件
- 小學(xué)英語一般現(xiàn)在時(shí)-(演示)課件
- 面部激素依賴性皮炎的管理課件
- 盧卡奇教學(xué)講解課件
- 智慧環(huán)衛(wèi)項(xiàng)目建設(shè)方案
- 焊接作業(yè)現(xiàn)場(chǎng)環(huán)境溫度濕度記錄
- 長(zhǎng)期護(hù)理保險(xiǎn)待遇資格申請(qǐng)表
- 馬克思主義基本原理教案:第一章+教案
- 【腳手架計(jì)算書】 腳手架計(jì)算書詳細(xì)步驟
評(píng)論
0/150
提交評(píng)論