P2P文件共享.ppt
- 格式:ppt
- 大小:1.15 MB
- 文档页数:78
合肥学院计算机科学与技术系课程设计报告2012~2013学年第一学期课程JAVA语言课程设计名称P2P 文件共享程序学生姓名学号1104014002专业班级11计算机科学与技术4班指导教师张贯虹、胡春玲2013 年1月一.设计题目及具体要求编写一个可以进行点对点的文件共享程序,能够进行网络上的文件共享和传输。
该程序软件可以在任何一个标准配置的主机上运行,运行该程序的主机既是客户端,也是服务器端,是一个多线程程序。
作为服务器端,运行一个服务器线程始终监听指定的端口,如果网络上有其他主机要求建立连接,互相交换共享文件信息,双方就可以互相下载对方共享的文件。
二.总体设计思路本程序仅有一个P2P.java的源码文件。
该文件中共有有四个类:P2P、suface、receive、send。
其中P2P为主类,程序启动后,由P2P中主函数public static void main(String args[])实例化一个surface对象。
Surface继承自frame类,并实现ActionListener接口,由它实现窗口界面与事件响应,并与用户交互。
Surface根据用户作出的具体操作选择(接收或分享)启动一个receive或send线程,由最终由receive线程对象完成接收操作,由send线程对象完成分享操作。
三.具体设计全局流程图:本程序涉及成员变量与方法名称种类功能从属sur surface类对象用户交互P2P main 主方法程序执行入口P2Pgb GridBagConstraints类对象自定义界面网格布局surfacegbl GridBagLayout类对象网格布局surfaceb1\b2\b3 \b4 Button类对象界面按钮surfacel1\linfo\si nfo Label对象标签,显示信息surfacetf TextField类对象文本框,输入对方IP地址surfacesfile\lfile string类对象文件名,存储文件位置surfac eload\save filedialog类对象打开\保存文件对话框surfaceiss; 布尔值记录用户选择分享\ 接收surfac esurface() surface类构造方法——surfaceactionPer formed()ActionListener接口中方法实现事件响应并启动线程surfacese\re send\receive类线程对象实现分享\接收功能surfaces socket类对象发起连接receive\sendfile file类对象表示进行I\O操作的文件receiv e\sendstr int值方便数据I\Oreceiv e\sendra InetAddress值表示对方IP地址receiv e\sendss ServerSocket类对象监听端口,接收连接receive\sendin InputStream输入流receiv类对象 efos FileOutputStream类对象文件输出流receivebos BufferedOutputStream 缓冲流receivereceive receive构造方法接收文件位置等参数receiveout OutputStream类对象输出流sendfis FileInputStream类对象文件输入流sendbis BufferedInputStream缓冲流send send send send send 用户交互模块:public void actionPerformed(ActionEvent e){if(e.getActionCommand()=="分享"){//用户选择分享load =new FileDialog(this,"请选择需要分享的文件", FileDialog.LOAD);load.show();//弹出文件对话框lfile = load.getDirectory()+ load.getFile();iss =true;//记录“分享”选择}if(e.getActionCommand()=="接收"){//用户选择接收save =new FileDialog(this,"请选择存放文件位置及文件名", FileDialog.SAVE);save.show();//弹出文件对话框sfile = save.getDirectory()+ save.getFile();iss =false;//记录“接收”选择}if(e.getActionCommand()=="本机接受连接"){if(iss){//若用户事先选择“分享”send se =new send(new File(lfile));se.start();//启动分享线程l1.setText("开始分享");}else{//若用户事先选择“接收”l1.setText("开始接收");receive re =new receive(new File(sfile));re.start();//启动接收线程}}if(e.getActionCommand()=="本机发起连接"){if(iss){//若用户事先选择“分享”send se;l1.setText("开始分享");try{se =new send(new File(lfile),InetAddress.getByName(tf.getText()));se.start();//启动发送线程}catch(UnknownHostException e1){l1.setText("输入地址有误!");}}else{//若用户事先选择“接收”receive re;l1.setText("开始接收");try{re =new receive(new File(sfile),InetAddress.getByName(tf .getText()));re.start();//启动接收线程}catch(UnknownHostException e1){l1.setText("输入地址有误!");}}}}}接收模块:class receive extends Thread {Socket s;File file;InputStream in;FileOutputStream fos;BufferedOutputStream bos;int str;InetAddress ra;receive(File file, InetAddress ra){//本地发起连接时构造方法(接收对方地址)this.file = file;this.ra = ra;}receive(File file){//本地接收连接时构造方法this.file = file;}public void run(){try{this.fos =new FileOutputStream(file);//建立文件输出流}catch(FileNotFoundException e1){surface.rinfo.setText("文件打开失败!");}try{this.bos =new BufferedOutputStream(fos);if(ra ==null){//若未得对方地址,表示本机接收连接ServerSocket ss =new ServerSocket(9999);//监听端口9999 s = ss.accept();}else//否则本机发起连接s =new Socket(ra,9999);in = s.getInputStream();while((str = in.read())!=-1)//读入输入流直至末尾bos.write(str);surface.rinfo.setText("接收成功!");bos.close();fos.close();in.close();s.close();}catch(IOException e){surface.rinfo.setText("接收失败!");}}}分享模块:class send extends Thread {Socket s;File file;int info;OutputStream out;FileInputStream fis;BufferedInputStream bis;int str;InetAddress ra;send(File file, InetAddress ra){//本地发起连接时构造方法(接收对方地址)this.file = file;this.ra = ra;}send(File file){//本地接收连接时构造方法this.file = file;}public void run(){try{this.fis =new FileInputStream(file);//建立文件输入流}catch(FileNotFoundException e1){surface.sinfo.setText("文件打开失败!");}try{this.bis =new BufferedInputStream(fis);if(ra ==null){//若未得对方地址,表示本机接收连接ServerSocket ss =new ServerSocket(9999);//监听端口9999 s = ss.accept();}else//否则本机发起连接s =new Socket(ra,9999);out = s.getOutputStream();while((str = bis.read())!=-1)//读入缓冲输入流直至末尾out.write(str);surface.sinfo.setText("分享成功!"); bis.close();fis.close();out.close();s.close();}catch(IOException e){surface.sinfo.setText("分享失败!");}}}1.程序启动界面2.接收成功界面3.分享成功界面4.对方IP输入有误,传输失败。
基于P2P网络的文件共享技术随着信息技术的快速发展,人们的生活方式也不断地面临变革。
一个重要的变革是文件共享技术的发展,其中基于P2P网络的文件共享技术是比较常见的一种形式。
本文旨在深入探讨该技术的基本原理和应用,同时介绍技术的优缺点及未来发展趋势。
一、P2P网络基本原理P2P网络指的是点对点网络,是一种去中心化的底层通信方式。
与传统的客户端-服务器模式不同,P2P网络的通信是通过各个节点之间的直接连接实现的。
在P2P网络中,每个端点(被称为peer)既可以提供服务,也可以使用其他节点的服务,实现互相协作并共同构建一个大规模的分布式系统。
P2P网络的结构通常分为两种:纯P2P网络和混合P2P网络。
纯P2P网络没有中心节点,所有节点的地位是平等的,因此其可扩展性和灵活性较好。
但是,由于节点之间的信任度不容易建立,纯P2P网络往往缺乏自治机制,容易受到攻击和破坏。
混合P2P网络则在传统的客户端-服务器模式的基础上加上P2P节点。
在P2P网络中,文件传输是一种重要的应用,其基本原理是将一个大文件分割成若干个小块,每个小块分别由不同的peer节点传输。
当一个接收方收到足够数量的小块时,就可以将它们组合成原始的文件。
由于每个小块均由不同的peer传输,因此可实现较快的下载速度和资源共享。
二、基于P2P网络的文件共享技术应用基于P2P网络的文件共享技术广泛应用于各种文件的在线传输和分享,例如音乐、电影和软件等。
其中,文件共享软件是最具代表性的应用之一,如BitTorrent、eMule和uTorrent等。
这些软件不仅能够提高文件下载速度,同时也是文件共享者和下载者之间的交流平台,是一个分布式的文件资源库。
除了文件共享软件,基于P2P网络的文件传输技术还被应用于各种在线存储服务和云计算平台。
用户可以将自己的文件存储在P2P网络中,并通过各种设备(如手机、平板和PC等)进行访问和管理。
P2P文件存储服务具有可扩展性和普及性的优势,有望成为传统在线存储服务的有效补充。
P2P文件共享系统的设计与优化随着互联网技术的不断发展,P2P(Peer-to-Peer)文件共享系统已经成为人们在互联网上分享和交换文件的主要手段之一。
其实现方式是通过将文件分为多个小块,并将这些小块分别上传到各个用户的计算机中,这样就可以利用所有用户的计算能力和硬盘空间来完成文件的共享。
在这篇文章中,我们将探讨P2P文件共享系统的设计和优化。
一、P2P文件共享系统的基本原理P2P文件共享系统的基本原理是通过将文件划分为多个相等的小块,在不同的计算机之间进行分发和共享。
用户只需要从系统中下载一个文件的某个块,就可以从其他用户的计算机上下载其他块,以此来实现文件的下载。
同时,P2P文件共享系统通过利用分布式算法来协调用户之间的通信和数据传输。
通过这种方式,可以在不需要中央服务器的情况下,实现高效的文件共享和数据传输。
二、P2P文件共享系统的优点1.高效性:P2P文件共享系统可以利用所有参与共享的用户的计算能力和硬盘空间来进行文件下载和上传。
这样,在大量用户同时进行文件共享时,文件下载的速度会更快。
相对于传统的文件下载方式,P2P文件共享系统可以显著提高文件传输的速度和效率。
2.可扩展性:P2P文件共享系统可以通过添加新的用户来扩展自身的能力。
这意味着,P2P文件共享系统可以在不需要增加中央服务器的情况下,实现无限的扩展。
3.便携性:P2P文件共享系统可以在不受时间和地域限制的情况下进行文件共享。
这意味着,用户可以从任何地方使用P2P文件共享系统来下载所需的文件。
三、P2P文件共享系统的设计P2P文件共享系统的设计包括两个方面:文件的分块和节点的选取。
1.文件分块文件的分块是P2P文件共享系统设计的重要一环。
文件分块越细,可以提供更多的下载并行度,加快文件的共享速度。
同时,为了避免小块的过多交互,因此选择适当大小的块非常重要。
同时,为了保证下载效率,需要考虑到下面几个问题:(1)块大小应该在合理的范围内。