P2P文件传输平台的设计与实现
《计算机网络程序设计》课程设计
题 目: P2P文件传输平台的设计与实现 学 院: 计算机科学与工程学院 专 业: 信息管理与信息系统 学生姓名:
学 号:
指导教师:
2011年 3月 24日
目 录
1. 前言 .....................................................................................................................................................3 2. 需求分析 .............................................................................................................................................3 3. 概要设计 .............................................................................................................................................3
3.1硬件环境 ........................................................................................................................................3
3.2软件环境 ........................................................................................................................................3 4. 详细设计 .............................................................................................................................................4 5. 测试 .....................................................................................................................................................6 6. 总结 .....................................................................................................................................................6 参考文献 .....................................................................................................................................................6 附录 .............................................................................................................................................................7
ii
言 1( 前
近年来,P2P(Peer-to-Peer,对等互联或点对点技术)作为因特网通信应用中一项新兴技术,他的发展迅速。基于P2P方式实现的软件,已经广泛应用于资源的下载、游戏的互动、交互式媒体播放、分布式计算等多种领域,并在越来越多的领域展现了巨大的应用潜力。
但是,到目前为止,仍然没有针对P2P的统一的网络应用开发
,其体系结构仍在不断地推陈出新。微软公司在.NET Framework 3.5中新增了System.Net.PeerToPeer命名空间,该命名空间下提供的类简化了利用P2P开发应用程序的难度,为创建P2P应用程序提供了简单的实现
和途径。
在P2P技术尚未风行之前,很多企业级应用采用C/S 或者B/S架构。在传统的C/S架构的应用程序中,客户端与服务器有明确的分界。客户端软件向服务器发出请求,服务器存放共享资源并对客户端请求作出响应。
P2P的特点:
相对于C/S架构来说,P2P具有以下的特点。
(1) 对等模式。P2P系统中的使用者能同时扮演客户端和服务器的角
色,使两台计算机之间能不通过服务器直接进行信息分享。
(2) 分布式网络数据存储结构。P2P技术的另一个重要的特点在于
“分散”。网络中所有的计算、存储和网络连接能 能力都分
布在非集中式网络的“对等伙伴”上。例如,在C/S架构中,
所有客户端都是直接从服务器下载所有资源。而P2P则改变
了以服务器为中心的状态,玫瑰节点可以先从服务器上各下
载一部分,然后再互相从对方或者其他节点下载其他部分。
采用这种方式,大量客户端同时下载时,不但不会形成服务
器网络宽带瓶颈,造成网络堵塞,反而提高了下载速度。当
然P2P也存在一些缺点。在许多流行的P2P应用中,都或多
或少涉及隐私安全以及版权等问题。
【关键字】P2P,文件传输,.net framwork
2( 需求分析
本系统采用基于Socket的局域网通信工具的设计与实现的方法,基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快递的通信机制,它的实现无需对企业原有的局域网进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好解决企业内部局域网的各种通信需求。
基于Socket的局域网聊天工具很好地诠释了Socket通信的原理,并且在企业内部通信,教学,讨论应用中有很好的实用价值。它具有信息收发速度快,保密性好,占用网络宽带资源低,占用服务器吞吐能力低,易于编程实现等优点。
聊天系统不外乎两个方面,服务器端和客户端。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看 1.下服务器端的任务:
3
服务器端应当建立一个ServerSocket,让管理者自己设置服务器端的服务端口,并且不断进行侦听是否有客户端连接或者断开连接(包括判断没有响应的连接超时)。服务器作为文件下载中心。主要是提供客户端的文件下载需要。在服务器端管理员可以随时增加或减少提供服务的文件资源。在服务端管理者可以查看客户端的信息。
2(客户端应该完成的工作包括:
与服务器端建立通信通道,向服务器端发送请求下载文件信息。接收来自服务器的文件流并保存所需要下载的文件。相对服务器而言,客户端的任务就是要用户知道服务器所提供服务的下载IP和端口号。当客户端与服务器连接成功后,在客户端,用户可以看到服务端所提供下载的文件信息。用户可以有选择的下载所需的文件。
3(总体设计
本课设主要研究的是局域网文件传输软件,此文件传输软件分为服务器程序和客户端程序,各有各自的窗体界面。本课设的目标是能实现用户在客户端可以从服务器上下载文件资料。
和System.Net命名空间下的 Socket类、IPAdress主要研究内容是:熟悉C#
类,了解TCP/IP的
。在VS2008开发平台下,利用sokcet套接字编程技术,多线程开发技术,TCP协议等进行局域网文件传输软件的实际开发。
1、实现的主要思想为:
在Internet上的文件传输程序一般都是以服务器提供服务端等待客户端来连接并及时作出响应,使用者通过客户端程序连接到服务器,就可以与服务器上的服务文件列表同步信息,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。
2、服务器端工作
服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目为10个,多出的客户端在服务器方不作出响应),与指定的本地服务端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket,同时创建一个线程来控制此连接。此时客户端就可以从服务器上进行下载所需要的文件了。
3、客户端工作流程
在客户端需要建立一个Socket与服务器端连接,并提供友好界面来给用户进行操作。当连接成功后就可以通过这个Socket来发送和接收数据了。
3.1硬件环境
?处理器:AMD 5400+或更高处理器
?内存:256MB或更高
?网络:局域网
3.2软件环境
?操作系统: windows XP
?开发平台:Microsoft Visual Studio 2008
?开发语言:C#
4. 详细设计
4
服务器端的设计:
服务端主要包括8个类,:Socket类, Listen类, Receive类,PortConf类,transfer类,FileStream类,FolderBrowserDialog类,还有静态类Directory
主要用到的命名空间有:System.Net,System.Net.Socket,System.IO,System.Threading.
private Socket socket;创建Socket实例,利用Socket(AdressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)方法创建一个本地套接字对象
private TcpListener listener;创建监听实例并绑定开放服务端口,用listener.Start()开始进行服务器监听,同时创建一个线程来进行控制。 FolderBrowserDialog fbd = new FolderBrowserDialog();打开服务器端所要服务的文件目录。for (int i = 0; i < Directory.GetFiles(dir).Length; i++)
{
str[i] = Directory.GetFiles(dir)[i];
richTextBox1.AppendText(str[i] + "\r\n");
}
用for循环来读取打开文件目录下的所有文件名,以方便客户端进行下载。 sock = listener.AcceptSocket()接收客户发来的连接信息。
当客户端与服务器建立好连接后用filestream=new FileStream()创建发送文件流。
客户端主要包括:TcpClient类,NetworkStream类,FileStream类,IPAddress类 主要用到的命名空间有:System.Net,System.Net.Socket,System.IO,System.Threading.
主要方法有:download()进行文件下载。
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
{ //构造新的文件流
filestream=new
FileStream(saveFileDialog1.FileName,FileMode.OpenOrCreate,FileAccess.Write);
//获取服务器网络流
netStream=client.GetStream();
string down=comboBox1.Text+"\r\n";
byte[]
by=System.Text.Encoding.BigEndianUnicode.GetBytes(down.ToCharArray());
//向服务器发送要下载的文件名
netStream.Write(by,0,by.Length);
//刷新流
netStream.Flush();
//启动接收文件的线程
new ThreadStart(download)); thread2=new Thread(
thread2.Start();
}//对应if(saveFileDialog1.ShowDialog()==DialogResult.OK)
5
图形界面编程:
利用TCP的socket或者UDP编写,客户端和服务器端程序可以进行多次对话。
服务器功能划分为以下模块和客户端功能划分为以下模块如下:
服务器
客户端
设启显建端设 置动示立口置 服或下和号文 务停载断设件 器止文开置 目 IP服件连录 端务 接 信 口息 号
5. 测试
运行效果截图如下:
6
7
6. 总 结
这次程序设计也是一个毅力的考验过程。有时候往往只是一个小小的错误,却要花出几小时甚至是一两天的时间才可能发现它。所以在这个过程不能过于急躁,要很有耐心将程序反复调试。
通过这次课程设计,对我们的逻辑思维能力是一个很大的锻炼,它不仅加强了我们的系统思考问题的能力,而且还改变了我们以前不好的编程习惯,虽然花费了不少的时间,但是我学到了丰富的知识。
附录:
监听代码:
private void button1_Click(object sender, System.EventArgs e)
{
if (richTextBox1.Text == ""&&textBox1.Text=="")
{
MessageBox.Show("請輸入服務器監聽端口");
8
return;
}
else
{
try
{
if (textBox1.Text != ""&&richTextBox1.Text!="")
{
port = Int32.Parse(textBox1.Text);
if (port > 65535 || port < 1)
{
MessageBox.Show("請輸入小於的正整數");
textBox1.Text = "";
return;
}
}
else
{
MessageBox.Show("請設置服務器文件目錄");
return;
}
}
catch (Exception ee)
{
MessageBox.Show("您輸入的格式不對~" + ee.ToString());
textBox1.Text = "";
return;
}
}
try
{
listener = new TcpListener(port);
//ServerSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
//ServerAddress = new IPEndPoint(IPAddress.Any, port);
//ServerSocket.Bind(ServerAddress);
//ServerSocket.Listen(10);
listener.Start();
statusBarPanel1.Text="服務器正在監聽......";
button1.Enabled = false;
//button4.Enabled = false;
button5.Enabled = false;
thread=new Thread(new ThreadStart(recieve));
9
thread.Start();
CheckForIllegalCrossThreadCalls = false;
}
catch(Exception ee){MessageBox.Show(ee.Message);}
}
连接代码:
int port=0;
IPAddress myIP=IPAddress.Parse("127.0.0.1");
try
{
if (textBox2.Text != "")
myIP = IPAddress.Parse(textBox2.Text);
else
return;
}
catch
{
MessageBox.Show("請輸入正確的IP地址格式~例如:.168.1.1");
}
client =new TcpClient();
try
{
if(textBox3.Text!="")
{
port=Int32.Parse(textBox3.Text);
if (port<1||port>65535)
{
MessageBox.Show("請輸入小於的正整數");
textBox1.Text = "";
return;
}
}
}
catch
{
MessageBox.Show("請輸入服務器監聽端口");
return;
}
参考文献
[1]胡希仁(计算机网络(
[2]马俊 C# 网络应用编程(第二版)
10