多媒体实验报告_第1页
多媒体实验报告_第2页
多媒体实验报告_第3页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、多媒体通信专业综合实验报告题目:窄带话音调频发送与接收系统班级:组员:目录一、课程目的 1二、实验要求 11. 基本要求 12. 提高要求 1三、实验分工 11. 发送端 12. 接收端 2四、背景知识 21.关于声卡技术 22.关于窄带调频与解调技术 23. 关于语音文件格式及播放软件 3五、核心技术 31. WAV 32角度调制 4六、实验功能实现 51.实验思路 52.实验步骤及结果 61)测试发送端 62)接收端准备工作 93)接收与发送的传输实现 103. 源代码 124. 结果分析 14七、功能提高与改善 151实验原理 152实验环境 163设计思路及源代码 164实验结果及分析

2、 37八、实验总结及心得 38、课程目的1希望通过本课的实践能够将所学理论课,通过综合设计的教学实践等环节有机的结合起来,达到提升综合设计能力的;2熟悉 WINDOWS 或 LINUX 操作系统的基本架构下声卡 /USB 摄像头的驱动程 序以及在多媒体语音通信中的应用;3掌握数字信号处理技术在音频 /视频信号处理及通信中的应用,通过读取生成 的数据文件完成对信号的处理,生成数据文件并通过播放器回放。二、实验要求1. 基本要求1) 语音频范围300HZ-3.4kHZ;数字信号采样速率48kHZ,载波:10kHZ,最大频偏 5kHZ2) 用C语言(VC)产生8s的音频数据,为标准音A (440HZ

3、)开始的8度音,生 成 wav 格式的调频数据3) 通过读取 wav 文件对其进行解调进行实时回放2. 提高要求发端实时采集语音信号压缩、处理后变成变成 UDP 数据包通过网络发出,接收 端实时接收。三、实验分工1. 发送端兰天宇负责:八度音信号的产生、调制以及 WAV 文件的生成、发送。2. 接收端师圣蔓负责:WAV文件的接收、解调、用声卡播放音频;实现音频的实时传输。共同查阅相关资料, 学习编程知识, 进行各种调试, 讨论交流实现功能并最 终完成实验报告的撰写。四、背景知识1. 关于声卡技术声卡是将话筒或线性输入的声音信号经过模 /数转换编程数字音频信号进行 数据处理,然后再经过数 /模转

4、换变成模拟信号,送往混音器中放大,最后输出 驱动扬声器发声。声卡同时具有 A/D 和 D/A 转换功能,将声卡作为数据采集的 A/D 转换装置 无疑是一个经济、方便的选择。声卡在 windows 环境下具有数据采集功能,但 系统的功能受到编程语言的限制, 数据分析与处理的功能非常有限。 例如,为了 对采集的数据进行功率谱分析, 则需要用 VB 或 C 语言来编写功率谱分析的子程 序,这显然增加了开发以声卡为数据采集硬件的数据采集系统的难度, 并且也不 利于分析功能的进一步扩展。2. 关于窄带调频与解调技术角度调制是原调制信号频谱的非线性搬移, 并且产生了新的频谱分量, 所以 又称为非线性调制。

5、FM(调频)在实际通信中的应用非常广泛,高保真音乐广播、 电视伴音信号传输、蜂窝电话以及卫星通信等。与幅度调制相比, FM 可以获得 较高的抗噪声性能。窄带调频是 FM 的一种特殊情况。窄带调频可以由乘法器实现,则可用相干解调的方法来回复原调制信号。 在本实验中八度音的频率为:fs1=262Hz;fs2=294 Hz;fs3=330 Hz;fs4=349 Hz;fs5=392 Hz;fs6=440 Hz;fs7=494 Hz;fs8=523 Hz;3. 关于语音文件格式及播放软件音频文件通常分为两类:声音文件和 MlDl 文件。声音文件可以分为 CD、 WAV文件、AlFF文件、Audio文件

6、、Sou nd文件、MPEG音频文件。不同格式 压缩算法不同,效果也不同。五、核心技术1. WAV1) WAV 的生成来源于对声音模拟波形的采样。 用不同的采样频率对声音的模拟波形进行采 样可以得到一系列离散的采样点, 以不同的量化位数 ( 8 位或 16 位)把这些采 样点的值转换成二进制数,然后存入磁盘,这就产生了声音的 WAV 文件,即 波形文件。2) WAV 文件结构WAV文件由若干chunk (块)组成。每一个块由各自的辨识码和块大小信 息为起始。3) WAV 的数据块以及辨识码 RIFF 是英文 Resource Interchange File Format 的缩写,是 wave

7、 文件所 使用的标准格式,作为 WAV 文件的开头,紧接其后的是描述文件总大小的四 字节 32 位二进制数据。 WAVE辨识码。WAVE是录音时用的标准的 WINDOWS文件格式,文件 的扩展名为 “WVA”。 WAVE 是 WAV 文件的格式说明。 Fmt块包含波形文件的大小、采样频率、采样位、声道数、编码格式等 重要信息。描述了文件全部的基本参数。 Data块包以辨识码data开头,后接4字节数据表示数据块大小,存储 了全部的波形采样数据。其中数据的排列与采样位数、声道数有密切关联。4) WAV 文件的创建(写入) :先确定所需创建的文件的声道数、采样频率、位数、波形参数等信息,依据 WA

8、V 文件各个参数之间的 关系计算得到文件的总大小、数据块大小以及 data 块内的一系列信息,将所得全部信息按照 WAV 文件 存储格式分别转换后存入 各个信息所属的数组中,然后依次写入到被创建的文件里,得到所需波形文件。5) WAV 文件的读取:根据 WAV 文件内容的存储顺序和所占空间,依次读取指定的字节数并将 信息存入相应的数组中。 再将各个数组中的信息转换为便于识别和处理的数据存 入相应变量中。6) WAV 文件的实现uclul cl 血 siie(_4udiai 5XEF_1utal 4jaUchal *mp =Lidar嗣壮神卜”屁AXE1.川苗文件实际数tsudursizei4=

9、uitu d 忖【过勾lz«.,K诈总大小uchjr&Et pcm2 = 1 jZtsOC:pan谟性编玛min'd fin:SEze:'fiET块大小udiarfiiituim d wa斗;uzkir fint ;3tEplehz4:uirn d sarnplshz;udiar fim.bjiepswHl-uixn芸国亍虽(kb a)uchar to_tiepMmple2;uint d_b>tepajnpL«朿样丈卜i 障 h*r frnt_bi1p*aniplr?|punit djbiijp«imp】q取样勺曾Udur缸-闻辱収:

10、鬣第却留两字* «亞釆fif时飛留milt cidMa心肢:f:v和悽士小urliar曲惬可匸4叫;2. 角度调制1) 调制原理角度调制信号的一般表达式为:S(t) Acos ct(t)(1)所谓频率调制(FM)指瞬时频率偏移随调制信号f(t)成比例的变化,即:d Kfm f(t)dt ( 2)式中:Kfm称调频灵敏度。这时,相位偏移为:(t) Kfm f( )d(3)代入式(1)得到FM信号表达式为:SFM(t) Acos ct KFM f ( )d 如果FM信号的瞬时相位偏移满足下式:(5)FM表达式展开得到:Kfm f( )d此时,FM信号的频谱宽度比较窄,称之为窄带调频。将S

11、fm (t) Acos ct Kfm f ( )d Acos ctcosKFM f( )d Asin ctsinKFM f( )d 当为窄带调频即满足式(5)的条件时,有:cosKfm f ( )d _1 sinKfm f( )d _Kfm f()d所以,式(6)可化简为:SNBFM (t)ACOS ct AKfmf ( )d sin ct(7)至此,得到窄带调频的一般表达式。以式 (7)作为数学模型,可直接建立窄带调频的原理框图,调制(f)卩2)解调原理用相干解调的方法,NBFM信号在接收端首先经过带通滤波器(BP)滤除频带 外信道加性噪声,然后经过乘法器与载波(-Sin 3 C相乘,用低通

12、滤波器滤除乘出 来的高频分量,最后经微分器去掉f(t)外面的积分,在输出端恢复原调制信号。 下面是解调框图。带通P“低通7微分器,L小gfg六、实验功能实现1 实验思路利用声卡的A/ D、D/ A技术和MATLAB的方便编程及可视化功能,实 现了一个简单的窄带话音调频发送与接收系统。该方案具有信号采集过程简单、 编程处理方便、界面友好、扩展性强、性能稳定等特点。用Matlab分别编写发送和接收程序,在发送程序中根据八度音频不同音阶 的频率用fprintf()函数生成八度音频信号,根据调频原理用规定的载波10kHZ和 最大频偏5kHZ生成调制信号,接下来根据规定的数据采样频率 48kHZ用wav

13、write()函数分别生成原始音频信号和调制信号的WAV文件,使用wavplay()函数播放WAV文件。在接收程序中,使用 wavrecord()函数记录下音频连接线传 送的调制信号,使用demod()函数,根据相应的调频参数进行解调,同时用 wavwrite()函数生成调制信号和解调后信号的 WAV文件,使用sound()函数播放 解调后的音频信号。在实验中,将两台电脑用音频连接线相连,同时运行发送和 接收程序,便可实现音频信号在两台电脑间的传输。立体声插头音频连接线如下图:2.实验步骤及结果1) 测试发送端在发送端电脑上新建两个文件夹,路径分别为D:se ndse ndcarryD:se

14、ndse ndsig nal 截图如下: D:scndT£. ij W qfl* O卞“ Kg' :m豕应*, J :¥") 'sjrridlrar rjl IJ iL抑 Ll亠_j l.'.Eaald刨逵一十帑立侍巫 *驚T対槪恫茁它也育托:ETi-ll运行发送程序send.m电脑上播放8s八度音频,同时在新建的两个文件夹中分别生成八度音频的 WAV文件signal.wav和FM调制后的 WAV音频文件carry.wav,WAV文件数字信号采样速率48kHZ,调频载波10kHZ,最大频偏5kHZ结果如下图: D : ?cnd scitdc

15、 &e rry'-I'nlfxl;珈p= :750 Orr+r:Ei涌履® a.® 收和山 T且 咐砂丈件參.rs ises川:1-IB." rend金已HairryrLJJ/'J五end£圧晋*冃上邻匡讦皆且分别用播放器播放signal.wav和carry.wav可以听到完整的八度音频和调制到高频较为尖锐的八度音频。用MATLAB生成的原始信号和调制信号的波形如下图:2)接收端准备工作在接收端电脑上新建文件夹,路径分别为D:receivecarryD: receive 'signal截图如下:T £.

16、il:i帘 6/1 叩Q后唱-Q - T p确:m主區».1 3. Wee sif t*flJ3狂则寸创富一亍軒半巫 幡这T丈件痕機ICJ心药它也育±<.£< Q .)共学立甘 吉茁电厢 屈二邻匡3) 接收与发送的传输实现用立体声插头音频连接线将发送端和接收端的电脑连接起来,在两台电脑上同时按发送程序send.m和接收程序receive.m的运行按钮,可以听到发送端电脑 先播放八度音频信号,经过8秒左右的时延接收端电脑开始播放接收到的解调后 的八度音频,与发送端的信号基本一致。同时在接收端的新建文件夹中生成接收 到的调制 WAV文件carry.wav和

17、解调后的 WAV文件signal.wav,可以播放。如 下图:D:rcccivocarry专件(T 靠馆® S G (Y1収昵 THQI WQf i0后左/丿)轩 丈帳匡地址 il D: "“icesy|_>三0转钊、,咅乐任务I/.:'":> ±a#e帖堆二色 7&啊,F IBj创崖一个护立停夹 a共宁比文件夹XECIHr«c<:y< 冋上邻匡洋怙日D:XrcccivoXsxenal口回仅I7f+(£-润馆 S G Q0 枫屍 TH Qi WQ)A 全 H»Ft 吝毆机购丕書忌文甘和

18、文件夹任备J仙連T驕立件夫 共車g件英7 O转刎receive左茁电临PUW3. 源代码发送端: 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(

19、'输入第 1S频率:); %fs2=input('输入第 2S频率:); %fs3=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('第 1

20、S频率:%7d Hzn',fs1); fprintf('第2S频率:%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=

21、9;D:sendsendsignalsignal.wav' pathcarry='D:sendsendcarrycarry.wav' fprintf(' 信号保存地址为:%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 &

22、t<3)+ cos(2*pi*fs4*t).*(t>=3 & t<4) + 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,

23、st)axis(0 0.05 -2 2)xlabel('Time')title('原始信号')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

24、(2*pi*fs5*t).*(t>=4 & t<5)+ fk/fs6*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(

25、' 调制后信号 ')wavwrite(fm,fp,16,pathcarry);wavplay(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(&

26、#39; 信号保存地址为: %sn',pathsignal); y=wavrecord(ts*fp,fp);wavwrite(y,fp,pathcarry);yy=demod(y,fc,fp,'fm');wavwrite(yy,fp,pathsignal);sound(yy,fp);4. 结果分析实验通过 MATLAB 实现了八度音频的生成调频、 WAV 文件的生成、发送、 接收以及解调播放。实现了两台电脑间音频信号的传输。实验中我们也遇到一些问题, 在前期测试阶段, 我们将两台电脑靠近, 通过 发送端喇叭对准接收端的话筒方式进行信号的传输,结果噪声较大,且不稳定, 观

27、测效果非常不明显。 后期我们买了音频连接线将两台电脑连接, 能够较好的实 现音频信号的高质量传输,改进后信号稳定清晰,很好地实现了预想的功能。同时我们的实验也存在很多不足, 传输过程中存在较长的时延, 而且不能实 现实时传输, 在接下来的工作中我们考虑用新的方式来完成实时传输的功能, 使用了 C#和MATLAB的混合编程,将在第七部分详述七、功能提高与改善1实验原理C#调用 MATLAB1) Matlab 精通各种数值计算和算法,但是没有优美的界面,且不能对数据库访 问操作,对数据有很好的操作能力。Visual studio (C#)拥有完美的界面编程,窗口或网络编程以及优越的数据库访 问等优

28、势,对 WAV 文件操作很简单。2) C#与matlab混合变成可以分成两种形式:1、matlab生成dll文件供C#调用2、C#生成dll文件供matlab调用和matlab直接调用.NET我们采用第一种方式3) 步骤实现1 、创建一个简单的 .m 文件2、使用 Matlab DeployTool 生成.Net组件3、创建一个测试用的 Windows 应用程序,将其命名为 MatlabTest,5、添加对 Matlab 生成的 twice.dll 的引用。6、添加窗体中相应的组件4、添加对 MWArray.dll 的引用7、编写相应的后台代码8、执行并查看结果实验中,在数据处理部分即核心的调

29、制解调使用 MATLAB 实现,使用 C# 进行人工交互界面。TCP 实现音频的网络实时传输在以太网上的 TCP/IP 协议下对多媒体信息 音频进行实时传输和同步 .TCP/IP是In ternet的基础协议,也是一种电脑数据打包和寻址的标准方法。1) UDP源端口(16)目标端口 (16)序号(32)应答号(32)头长度保留(6)编码位(6)窗口 (16)校验和(16)紧急(16)可选项(如果有,0或32)数据(可源端 口 (16)目标端口 ('6)报文长度(16)校验和(16数据(可变)UDP为应用程序提供的是一种不可靠的、无连接的分组交付,因此,UDP报文可能会出现丢失、乱序、重

30、复、延时等问题。2) UDP的局限性UDP为应用程序提供的是一种无连接、不可靠的分组交付。当网络硬件失 效或者负担太重时,数据包可能就会产生丢失、重复、延时、乱序的现象。这些 都会导致我们的通信不正常。如果让应用程序来担负差错控制的工作,无疑将给 程序员带来许多复杂的工作,于是,我们使用独立的通信协议来保证通信的可靠 性是非常必要的。3) 传输控制协议TCP是一个面向链接的、可靠的通信协议。1在开始传输前,需要进行三次握手建立链接2. 可靠性:在传输过程中,通信双方的协议模块继续进行通信3. 通信结束后,通信双方都会使用改进的三次握手来关闭链接2. 实验环境64 位 Windows7 系统32

31、 位 Matlab2009b64 位 Visual Studio20103. 设计思路及源代码1)发送(客户端)在运行客户端的程序输入服务器的IP和端口,即可连接上。根据C#中使用TCP 协议的要求设置相应的参数进行数据包的发送。 客户端的过程分为以下几个步骤:1) 初始化套接字的版本信息 WSAStartup;(2)创建套接字(socket)用于连接服务器端;3) 与服务器进行连接 Connect;4) 设置循环状态,进行接收和发送 (recv 和 send);5) 关闭套接字 (closesocket);源代码:Net.csusing System;using System.Net;usi

32、ng System.IO;namespace sever/ <summary>/ Net : 提供静态方法,对常用的网络操作进行封装/ </summary>public sealed class Netprivate Net() / <summary>/ 向远程主机发送数据/ </summary>Ill vparam name="socket">S发送数据且已经连接到远程主机的 Socket</param>Ill vparam name="buffer">待发送的数据 <lpa

33、ram>Ill vparam name="outTime">发送数据的超时时间,以秒为单位,可以精 确到微秒 vlparam>lll <returns>0发送数据成功;-1:超时;-2:发送数据出现错误;-3:发送 数据时出现异常 vlreturns>lll vremarks >lll 当 outTime 指定为 -1时,将一直等待直到有数据需要发送lll vlremarks>public static int SendData(Socket socket, byte buffer, int outTime)if (socke

34、t = null | socket.Connected = false)throw new ArgumentException(”参数 socket 为null,或者未连接 到远程计算机 ");if (buffer = null | buffer.Length = 0)throw new ArgumentException(”参数 buffer 为null ,或者长度为 0");int flag = 0;tryint left = buffer.Length;int sndLen = 0;while (true)if (socket.Poll(outTime * 100,

35、SelectMode.SelectWrite) =true)SocketFlags.None);据已经全部发送据部分已经被发送sndLen = socket.Send(buffer, sndLen, left,left -= sndLen;if (left = 0) / 数flag = 0; break; elseif (sndLen > 0) / 数continue; else/ 发送数据发生错误 flag = -2; break; else/ 超时退出 flag = -1;break;catch (SocketException e) flag = -3; return flag;/

36、 <summary>/ 向远程主机发送文件/ </summary>/ <param name="socket" >要发送数据且已经连接到远程主机的 socket</param>Ill vparam name="fileName">待发送的文件名称 </param>III vparam name="maxBufferLength">文件发送时的缓冲区大小 </param>Ill vparam name="outTime">发送缓

37、冲区中的数据的超时时间 </param>Ill <returns>0发送文件成功;-1:超时;-2:发送文件出现错误;-3:发送 文件出现异常; -4:读取待发送文件发生错误 vIreturns>III vremarks >III 当 outTime 指定为-1时,将一直等待直到有数据需要发送III vIremarks>public static int SendFile(Socket socket, string fileName, int maxBufferLength, int outTime)if (fileName = null | maxB

38、ufferLength v= 0)throw new Argume ntExceptio n(”待发送的文件名称为空或发送 缓冲区的大小设置不正确 .");int flag = 0;tryFileStream fs = new FileStream(fileName, FileMode.Open,FileAccess.Read);long fileLen =fs.Length;/ 文件长度long leftLenfileLen;/ 未读取部分int readLen =0;/ 已读取部分byte buffer= null;if (fileLen <=maxBufferLength

39、)/* 文件可以一次读取 */buffer =new bytefileLen;readLen= fs.Read(buffer, 0, (int)fileLen);flag = SendData(socket, buffer, outTime); else /* 循环读取文件 ,并发送 */while (leftLen != 0)if (leftLen < maxBufferLength) buffer = new byteleftLen; readLen = fs.Read(buffer, 0, Convert.ToInt32(leftLen); elsebuffer = new byt

40、emaxBufferLength;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.Linq;namespace severstatic class Program/ <summary>

41、;/ 应用程序的主入口点。/ </summary>STAThreadstatic void Main()Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1();Form1.csusing System;using System.ComponentModel;using System.Data;using System.IO;using System.Drawing;using System.Linq;using

42、System.Text;using System.Net;namespace severpublic partial class Form1 : Form Socket socketClient;public Form1()InitializeComponent();private void button1_Click(object sender, EventArgs e) TcpClient client = new TcpClient();client.Connect(IPAddress.Parse(txtIp.Text), int.Parse(txtPort.Text); Network

43、Stream ns = client.GetStream();FileStream fs = new FileStream(txtFileName.Text, FileMode.Open); int size = 0;/初始化读取的流量为 0 long len = 0;/初始化已经读取的流量 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.F

44、lush(); ns.Flush(); fs.Close(); ns.Close(); /ShowMgs(txtFileName.Text + " 文件发送成功 ");public void ReceiveMsg() while (true) try int size = 0;int len = 0;TcpClient client = TCPListener.AcceptTcpClient();if (client.Connected)/向列表控件中添加一个客户端的Ip和端口,作为发 送时客户的唯一标识/ShwMsgForView.ShwMsgforView(lstbxM

45、sgView, " 客户端连接成功 " + NetworkStream stream = client.GetStream();if (stream != null)SaveFileDialog sfd = new SaveFileDialog();if (sfd.ShowDialog(this) = stri ng fileSavePath = sfd.FileName;/获得用户保 存文件的路径FileStream fs = new FileStream(fileSavePath, FileMode.Create, FileAccess.Write);byte buff

46、er = 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)/ ShwMsgForView.ShwMsgfo

47、rView(lstbxMsgView, " 出现 " + ex.Message);private void button2_Click(object sender, EventArgs e)OpenFileDialog ofd = new OpenFileDialog();if (ofd.ShowDialog() = txtFileName.Text = ofd.FileName;private void button3_Click(object sender, EventArgs e)int i = Net.SendFile(socketClient, txtFileNa

48、me.Text, 512, 1);if (i = 0)/ShowMgs(txtFileName.Text + "文件发送成功 "); socketClient.Close();/ShowMgs(" 连接关闭 ");else/ShowMgs(txtFileName.Text + "文件发送失败 ,i=" + i); 2)接收(服务器)时刻监听发送过来的数据,与发送端相对应,根据TCP协议设置相应的参数, 完成数据包的接收,实现发送与接收的实时性。服务器端的过程可以分为以下几个步骤:(1)初始化套接字的版本信息 WSAStartup;(2

49、)创建套接字,需要两个套接字及客户端和服务器端的套接字;(3)绑定服务器(bind),该函数用于绑定服务器套接字;(4)监听服务器(listen),该函数用于监听服务器;( 5)接收客户端请求( accept) 返回值为客户端的套接字,参数为服务器套字;( 6)接收客户端数据 (recv);( 7)关闭套接字。ReceiveFiles.csusing System;using System.Linq;using System.Text;using System.Threading;using System.Net;using System.IO;namespace clientpublic c

50、lass ReceiveFilesprivate static Thread threadWatch = null;private static Socket socketWatch = null;private static ListBox lstbxMsgView;/ 显示接受的文件等信息private static ListBox listbOnline;/ 显示用户连接列表private static Dictionary<string, Socket> dict = new Dictionary<string, Socket>();/ <summary&

51、gt;/ 开始监听/ </summary>/ <param name="localIp"></param>/ <param name="localPort"></param>public static void BeginListening(string localIp, string localPort, ListBox listbox, ListBox listboxOnline) /基本参数初始化 lstbxMsgView = listbox; listbOnline = listboxO

52、nline;/创建服务端负责监听的套接字,参数(使用IPV4 协议,使用流式连接,使用Tcp协议传输数据)socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/获取Ip地址对象IPAddress address = IPAddress.Parse(localIp);创建包含Ip和port的网络节点对象IPEndPoint endpoint = new IPEndPoint(address, int.Parse(localPort);/将负责监听的套接字绑定到唯一的Ip

53、和端口上 socketWatch.Bind(endpoint);/设置监听队列的长度 socketWatch.Listen(10);/创建负责监听的线程,并传入监听方法 threadWatch = new Thread(WatchConnecting);threadWatch.lsBackgrou nd = true;/设置为后台线程 threadWatch.Start();/开始线程ShowMgs("服务器启动监听成功");ShwMsgForView.ShwMsgforView(lstbxMsgView, " 服务器启动监听成功 ");/ <su

54、mmary>/ 连接客户端/ </summary>private static void WatchConnecting()while (true)/ 持续不断的监听客户端的请求/开始监听 客户端连接请求,注意:Accept方法,会阻断当前 的线程Socket connection = socketWatch.Accept();if (connection.Connected)/向列表控件中添加一个客户端的Ip和端口,作为发送时 客户的唯一标识/将与客户端通信的套接字对象conn ection添加到键值对集合中,并以客户端Ip做为健connection);/创建通信线程Par

55、ameterizedThreadStart pts = newParameterizedThreadStart(RecMsg);Thread thradRecMsg = new Thread(pts); thradRecMsg.IsBackground = true; thradRecMsg.Start(connection);ShwMsgForView.ShwMsgforView(lstbxMsgView, " 客户端 连接成功 " + / <summary>/ 接收消息/ </summary>/ <param name="socketClientPara"></param>private static void RecMsg(object socketClientPara)Socket socketClient = socketClientPara as Socket;while (true)/定义一个接受用的缓存区(100M字节数组)/byte arrMsgRec = new byte1024 * 1024 * 100;/将接收到的数据存入arrMsgRec数组,并返回真正接受到的数 据的长度if (socketClient.Connected)t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论