终端文件共享监控
摘 要
为了使网络资源达到充分利用,提高使用效率,本程序在VS2010 环境下,用C#语言开发的文件共享系统,能够在两台终端电脑之间用UDP协议传输文件,达到文件共享的目的。服务器先将共享的文件添加到共享列表,客户端向服务器发送请求获取共享列表,客户端获得共享列表以后,将需要的共享文件添加成另一张共享列表,并将此列表发给服务器,服务器收到该列表后,将列表中的文件通过UDP协议发送给客户端,客户端接收到文件后,共享文件过程结束。在文件的发送过程中,服务器需要先将文件转化为流,客户端收到流以后再将其转化为文件。
关键词:文件共享;UDP传输;文件传输;VS2010
目 录
论文总页数:××页
1引言........................................................................1
1.1课题背景................................................................1
1.2国内外研究现状..........................................................1
1.3系统需求................................................................1
2系统关键技术................................................................2
2.1C#语言介绍..............................................................2
2.1.1网络编程技术基础...................................................2
2.1.2文件共享原理.......................................................2
3文件共享总体设计............................................................3
3.1主要功能叙述............................................................3
4.2系统整体设计图.......................................................3
结 论......................................................................3
参考文献......................................................................4
致 谢......................................................................5声 明......................................................................6
1引言
1.1课题背景
网络给我们带来了许多方便,我们可以用文件共享轻轻松松的与其他人分享
文件,文件共享是指主动地在网络上(互联网或小的网络)共享自己的计算机文
件。一般文件共享使用P2P模式,P2P就是人可以直接连接到其他用户的计算机、
交换文件,而不是像过去那样连接到服务器去浏览与下载;它改变互联网现在的
以大网站为中心的状态、重返“非中心化”,并把权力交还给用户。文件本身存
在用户本人的个人电脑上。大多数参加文件共享的人也同时下载其他用户提供的
共享文件。
1.2国内外研究现状
P2P技术目前是互联网文件共享中广泛采用的一种方式。在早期的IRC聊天
为是一种传统的“服务器-客户端”模式的文件传输方式。这种传统方式被命名
为P2S,即Peerto Server。下面两图便形象地表明了P2S模式和P2P传输模式
系统中,就有一些客户端允许用户间点对点地传输文件。而当时的FTP便可以认
的巨大优势。
指标体系通常是一个多指标、层次化的结构,能够由表及里、深入清晰的表
述读者满意度测评指标体系的内涵。每一层次的测评指标都是由上一层测评指标
展开的,而上一层次的测评指标体系则是通过下一层的测评指标的测评结果反映
出来的[2]。
2.系统关键技术
2.1C#语音介绍
C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向
对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复
杂特性(例如没有宏和模版,不允许多重继承)。C#综合了VB简单的可视
化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创
第1页共 4页
新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
C#语言的主要特点如下:
C#吸收了C++、VisualBasic、Delphi、C#等语言的优点,体现了当今最新的程序设计技术的功能和精华。C#继承了C语言的语法风格,同时又继承了C++的面向对象特性。不同的是,C#的对象模型已经面向Internet进行了重新设计,使用的是.NET框架的类库;C#不再提供对指针类型的支持,使得程序不能随便访问内存地址空间,从而更加健壮;C#不再支持多重继承,避免了以往类层次结构中由于多重继承带来的可怕后果。.NET框架为C#提供了一个强大的、易用的、逻辑结构一致的程序设计环境。同时,公共语言运行时(CommonLanguage Runtime)为C#程序语言提供了一个托管的运行时环境,使程序比以往更加稳定、安全。其特点有:
·语言简洁。
·保留了C++的强大功能。
·快速应用开发功能。
·语言的自由性。
·强大的Web服务器控件。
·支持跨平台。
2.2 网络编程技术基础 |
客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。
2、交换数据
连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。
根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。
3、关闭网络连接
在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。
最基本的步骤一般都是这三个步骤,在实际实现时,步骤2会出现重复,在进行代码组织时,由于网络编程是比较耗时的操作,所以一般开启专门的现场进行网络通讯。
二、服务器端网络编程步骤 服务器端(Server)是指在网络编程中被动等待连接的程序,服务器端一般实现程序的核心逻辑以及数据存储等核心功能。服务器端的编程步骤和客
第2页共 4页
户端不同,是由四个步骤实现,依次是:
1、监听端口
服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。
这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
2、获得连接
当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。
一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由的线程实现。
3、交换数据
服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。
4、关闭连接
当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。
端的压力比较大,而UDP是不需要建立连接的,对于服务器端的压力比较小 罢了。 这就是服务器端编程的模型,只是TCP方式是需要建立连接的,对于服务器
3.1系统主要功能描述
服务器端将共享的文件名和路径添加到共享列表,然后开始监听,若有客户端发来请求,则将共享列表发送给客户端。客户端收到共享列表后,从中选取自己需要的文件,将其添加到另一张下载列表发送到服务器,服务器将下载列表中需要的文件发送给客户端。
第3页共 4页
3.2系统整体设计图
1.服务器生成共享列表,将共享文件的信息保持在列表中并开始监听端口。2.客户端需要共享文件时,先向服务器发送请求。
3.服务器收到请求后将共享列表发送至客户端。
4.客户端收到共享列表后,将需要的文件信息生成下载列表,发送到服务器。
5.服务器根据下载列表,将客户端需要的文件转化为流发送到客户端。
6. 客户端接收到流以后将其转化为文件,整个共享文件过程结束
4.1.1生成共享列表
openFileDialog1.ShowDialog();
foreach(String i in openFileDialog1.FileNames)
{
textBox_ShareFOur.Text+= i+Environment.NewLine; }
将共享文件添加到共享列表
4.1.2监听客户端请求
IPEndPoint Client_Ip = new IPEndPoint(IPAddress.Any,0);
Byte[]Rec_Udp = UDP_jianting.Receive(ref Client_Ip); Udp_String =Encoding.Default.GetString(Rec_Udp);
String[] Udp_split =Udp_String.Split('#');
第4页共 4页
if(Udp_split.Length >= 1)
{
if(Udp_split[1] == "1")
{
String | Send_String | = | UDP_ListView | + |
textBox_ShareFOur.Text;
Byte[]Send_Byte = Encoding.Default.GetBytes(Send_String); UDP_jianting.Send(Send_Byte,Send_Byte.Length, Client_Ip); }
用字节流Byte[]存储客户端的IP地址,如果Byte[]不为空,表示有客户端发起请求。
4.1.3向客户端发送共享列表
privatevoid Udp_ListenFunction()
{
while(1 > 0)
{
IPEndPointClient_Ip = new IPEndPoint(IPAddress.Any,0);
Udp_String = Encoding.Default.GetString(Rec_Udp); String[] Udp_split= Udp_String.Split('#');
Byte[] Rec_Udp =UDP_jianting.Receive(ref Client_Ip);
ShareLiebiao = Udp_split[2];
}
StringFileNames = Udp_split[2];
String[] FileName =
FileNames.Split((Environment.NewLine).ToCharArray());
if(FileName.Length>=1)
for (int i = 0; i <FileName.Length-1; i = i + 2)
{
Filename_Queue.Enqueue(FileName[i]);
}
StringFileName_Path = Filename_Queue.Dequeue();
FileStreamFile_SendReader = new
FileStream(FileName_Path,FileMode.Open,FileAccess.Read);
BinaryReader binary_FileReader = new
BinaryReader(File_SendReader);
String File_Name =
FileName_Path.Split('\\')[(FileName_Path.Split('\\').Length-1)];
Byte[] File_SendBytes =
第5页共 4页
Encoding.Default.GetBytes(File_Send+(Filename_Queue.Count+1).ToString()+"#"+Fil
e_Name+"#"+File_SendReader.Length);
UDP_jianting.Send(File_SendBytes,
File_SendBytes.Length,Client_Ip);
}
}
4.1.4向客户端发送文件
StringFileName_Path = Filename_Queue.Dequeue();
FileStream | File_SendReader | = | new |
FileStream(FileName_Path,FileMode.Open,FileAccess.Read);
BinaryReader | binary_FileReader | = | new |
BinaryReader(File_SendReader);
String | File_Name | = |
FileName_Path.Split('\\')[(FileName_Path.Split('\\').Length-1)];
Byte[] | File_SendBytes | = |
Encoding.Default.GetBytes(File_Send+(Filename_Queue.Count+1).ToString()+"#"+File_Name+"#"+File_SendReader.Length);
File_SendBytes.Length, Client_Ip);
String b_String = File_SendContinue +
Encoding.Default.GetString(b);
Byte[] c = Encoding.Default.GetBytes(b_String);
Send_FileTest += b_String;
UDP_jianting.Send(c,c.Length,Client_Ip);
}
File_SendReader.Close();
binary_FileReader.Close();
客户端先将文件的内容转化为二进制流发送给客户端,一次最大可发送4M文件。
4.2客户端设计
FileStream fs = new FileStream(text, FileMode.Create,FileAccess.Write); 接收服务器发送的文件
BinaryWriter binary_FileWriter = new BinaryWriter(fs);
第6页共 4页
inti = 0;
while(FileLenth >= i * 4101) //这个是接受文件流
{
Byte[]b = Encoding.Default.GetBytes(Udp_split[2]); Rec_FileTest+= Encoding.Default.GetString(b); binary_FileWriter.Write(b,0, b.Length);//将接收的流用写成文件
if(b.Length > 0)
{
i++;
}
}
binary_FileWriter.Close();
fs.Close();
File_Number--;
UDP_jianting.Send(Encoding.Default.GetBytes(File_SendEnd), Client_Ip);
File_SendEnd.Length,
5 系统测试
界面
经测试,程序运行正常,完成了预计的功能。
结 论
第 7 页 共 4 页
本次课程设计是使用C#语言编写的远程控制系统,系统以及基本完成,系统功能已经实现。实现了P2P文件传输达到文件共享的功能。
C#语言是一门完全面向对象的新语言,是今后计算机语言发展的趋势,它的发展速度之快是广大计算机爱好者经验的积累和总结的结果,与其强大的网络功能是分不开的。由于本人C#语言掌握不熟练,在开发中遇到了很多的困难,比如说在传输超文本文件过程中,在将文件转为流传输时,
遇到一些编码问题导致文件损坏等等。在一次次的困难克服过程中,我得到了很大的锻炼。同时,通过此次设计,我对网络的Socket套接字编程有了更加深刻的了解。
虽然完成了程序设计,但我深知这个系统还有很多需要完善之处,目前只能进行点对点的文件传输和共享,在客户端对共享列表的处理方面也有问题等等。
这说明我还需要更加认真地完善这个系统,让它更接近真实的文件共享系统。
参考文献
[1]甘刚.Liunx/UNIX网络编程[M].中国水利水电出版社,2008。
第8页共 4页
[2]邱锦伦,王国辉.VisualC#.NET [M].清华大学出版社,2006。
第9页共 4页