p2p 文件共享系统
DESCRIPTION
P2P 文件共享系统. 制作人 : 李洁顺 指导教师:杨淑萍 张 霞. 项目要求. 使用 JXTA 平台的 CMS 开发一个简单的文件共享系统,要求完成的基本功能包括: P2P 网络中搜索功能的实现; 下载功能的实现; 实现文件共享功能的实现; P2P 文件共享系统的主界面如下图所示,. P2P 的现状及发展. 一, P2P 概述. - PowerPoint PPT PresentationTRANSCRIPT
P2P 文件共享系统
制作人 :李洁顺
指导教师:杨淑萍 张 霞
项目要求
使用 JXTA 平台的CMS 开发一个简单的文件共享系统,要求完成的基本功能包括:
P2P 网络中搜索功能的实现;
下载功能的实现; 实现文件共享功能的
实现; P2P 文件共享系统的
主界面如下图所示,
P2P 的现状及发展
一, P2P概述
P2P是 peer-to-peer 的缩写, peer 在英语里有“ ( 地位、能力等 ) 同等者”、“同事”和“伙伴”等意义。 P2P 也可理解为“伙伴对伙伴”的意思,或“对等联网”。简单的说, P2P让人们通过互联网直接交互。这样, P2P 就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载;它改变互联网现在的以大网站为中心的状态、重返“非中心化”,并把权力交还给用户。
P2P 看起来似乎很新,但是正如B2C、 B2B 是将现实世界中很平常的东西移植到互联网上一样, P2P 并不是什么新东西。在现实生活中我们每天都按照 P2P 模式面对面地或者通过电话交流和沟通。事实上,网络上现有的许多服务可以归入 P2P 的行列。即时讯息系统譬如 ICQ、 AOL Instant Messenger、 TomSkype、 Yahoo Pager 、微软 MSN Messenger 以及国内的 OICQ 是最流行的 P2P 应用。它们允许用户互相沟通和交换信息、交换文件。
二, P2P的现状 P2P( peer-to-peer )已经不是什么新概念,现在已经
有着无数网民使用着基于 P2P 技术开发的文件共享、网络交流等软件。 P2P 可以理解为“伙伴对伙伴”的意思,或称为对等联网。目前人们认为 P2P 在加强网络的交流、文件交换、分布计算等方面大有前途。
就给大家介绍几款 05 年比较火热的 P2P 下载软件,无论是下载 MP3 、电影、综艺节目、球赛还是软件,甚至一些在互联网中搜索不到的资源,这些软件都可以达到你的要求,让你真正享受到 P2P 点对点技术给你带来的乐趣。
将要推荐介绍的五款 P2P 下载软件分别为: PP 点点通、百宝、 BitTorrent Plus!II 、酷狗 (KuGoo) 、电骡(eMule) 。这几款软件在 05 年度,同时在线人数、下载次数、注册用户等都是排在前列的,而且各软件都有自己特点,都适合不同的用户群。下面就跟随笔者来了解一下各个软件的功能与使用。
05年 P2P 最为火爆的一年,网络上到处都可以看到P2P 下载的身影,从大型的软件到刚刚上映的电影。虽然,这些给网友带来了极大的快感,但是也让更多版权人士把P2P作为眼中钉。现在,美国方面已经开始整顿 P2P市场,比较知名的 P2P 软件“电驴”就在这场整顿中消失在美国的网络中。从中我们可以看到 P2P 的快感背后也不是那么风平浪静,今天可能是“电驴”明天呢? P2P 这种优秀的文件传输方式难道就因为这个问题而会消亡在 06 年吗……
三, P2P的发展历程
P2P 的发展可分为以下三个阶段。 第一代的文件交换服务以 Napster和 BT独领风骚,其技术是建立一个大型的集中化
索引,对网络上所有的可用资源进行追踪。这种方法虽然相当有效率,让使用者可以存取到庞大的资源,但同时发生了最著名的官司:美国唱片业协会( RIAA )代表环宇音乐、索尼音乐、华纳音乐、百代唱片、 BMG 等七大唱片公司以违反版权保护法为由把 Nap ster 公司推上法庭,历时三年最终将 Nap ster 告倒,法院最终判定Napster侵权。
第二代分散式服务以国外的 Kazaa 和国内迅速崛起的 POCO 为代表。改为在电脑间发送搜索请求,一直到找到文件为止,然后再将信息传回搜索者的电脑。这种技术一开始相当不便,特别是数以百万计的搜索要求在网络上的每一台电脑间来回发送时,在高峰时段往往造成网络大塞车。后来通过随机方式选出品质较优的用户来作为节点服务器,用户可从节点服务器上获得 peerlist ,下载方法也越来越进步。但与第一代 P2P 软件命运截然不同的是,美国法院最近宣判,这种分散式的 P2P 应用是合法的,这种软件的散播者并未直接控制网络上所出现的行为。
第三代的 P2P 网络则是以 eDonkey、 emule、Morpheus为代表,比以前更为分散化。它采用“分散式杂凑表”的方法,基本上是对网络上某一特定时刻的文件进行快照( snapshot),然后将这些信息分散到整个网络里。为了找到特定的文件,搜索的要求先到达网络上的任何一台电脑,然后这台电脑就会再将它转到另一台有更多文件信息的电脑,第三台电脑可能就拥有文件本身,或者也可能再继续转到其他有正确信息的电脑。整个过程有点像依照线索循序问路而找到正确方向,而不是路上随便抓人问路。每个网络相关信息,会随电脑及文件的加入而持续更新。 StreamCast2004 年向哈佛学生BenWilkin及 FrancisCrick买下这项技术。这两位前哈佛学生表示,他们的技术只要跳三至四次就可以在几百万台电脑的网络里找到任何文件,不管这个文件多么稀有。这种技术也让一些应用有了新的前景,例如网络电话。 Neonet与eDonkey专注的都是文件交换,但 SKYPE专注于网络电话。这种有效率的网络路由技术可用于快速连接网络电话,但也给传统电信运营商带来了冲击。
四,中国 P2P的发展将走向何方? P2P 技术为互联网的发展带来了深远的影响,也为 IT产业带来了无限的商机。对于 P2P未来发展趋势的探讨和研究,一直是业界和学界关注的焦点之一。 P2P 在中国的发展并非一帆风顺,它经历了繁荣,也遭遇过停滞,目前正在迎接新一轮的发展。 P2P 在中国能否再创辉煌?谁将在新一轮的竞争中成为赢家?中国 P2P的发展将会何去何从? 互联网领域的专业研究咨询机构——互联网实验室新近推出的《 P2P 的现状及发展趋势研究报告》,以丰富的资料研究和深入的案例分析,在立足 P2P 发展现状的同时,对国内外 P2P 的发展趋势做了全面客观的预测,对 P2P企业所关心的一切关于 P2P 现状和发展趋势的问题,都给予了专业解答。
从目前的状况来分析,中国的 P2P市场正处在自由竞争阶段,进入市场的企业无论是规模还是实力,都不相上下。因此,在较长的一段时期,中国的 P2P市场将延续群雄逐鹿的竞争局面。互联网实验室认为,当前 P2P 行业标准尚未形成,而P2P 的相关应用又及其广泛,技术门槛与经营门槛都相对较低,是这种竞争局面长期存在的主要原因。在尝试了 P2P 在即时通信、音乐共享与下载等方面的产品开发与经营后, P2P 在中国的发展将会以探求 P2P更多的商业应用为核心。在这方面,国外许多 P2P企业就走在了前面。无论是协同办公,还是分布式计算,国外的 P2P企业都有过比较成功的探索,为国内 P2P企业提供了许多值得借鉴的经验。而国内立足于这两方面应用的 P2P企业,数量很少,规模也远不及国外的竞争对手。事实上,面向企业的 P2P 应用,在中国市场是大有可为的。此外,在中国,电子商务的市场发展潜力无穷,在互联网实验室新近推出的《 P2P 的现状及发展趋势研究报告》中有数据显示:到 2003 年底,中国的电子商务市场 B2B和B2C 的交易总额将可能达到 40亿美元之巨, B2B 的年均增速为 19.4%,而 B2C 的年均增速是 27.4%,均呈倍数增长。这样广阔的发展前景,势必为 P2P 在电子商务领域的应用带来无限商机。
P2P 系统的特征
网络中的用户知道其他用户的存在 在现有网络架构的基础上,构建了一个虚拟网络,对互联的各个节点的复杂性进行了抽象,不用考虑现有防火墙、 NAT 和特定网络服务的缺乏。
每个计算机用户既是服务器,也是客户端。
各个计算机用户可能形成组,成为一定数据和应用程序运行的共同体
JXTA原理介绍
目的 : 就是直接为 P2P提供支持和服务,被定义为一个为 P2P 应用程序和服务提供标准协议的开放式资源项目。
定义一套 xml协议 :该协议被设计用于提供对对等节点形成的动态网络所需的通用功能的支持,协议本身独立于操作系统、开发语言和网络传输协议。
JXTA 的安装和配置 下载地址 : http://download.jxta.org/build/release JXTA 的配置:第一次运行 JXTA程序的时候, JXTA 的自动配置工具就会显示出来,用于配置 JXTA 平台的网络环境,包括 peer 的信息、 TCP/IP和 HTTP 的配置、 Rendezvous和 Relay peer 以及安全信息。
在 JXTA配置界面中,用户可以配置基本的、高级的信息, Rendezvous/Router 和安全信息等。一般来说,用户只需要在基本信息面板中设置 peer 的名称,在安全信息面板中设定用户名和密码就可以了 .
JXTA 的安装和配置
P2P 文件共享系统 CMS 概述 CMS( Content Manager Services )是一个
在点组中的多个点之间共享内容的服务。该服务使得 Peer 可以共享自己的内容以及定位和获取其他 Peer 上的内容。 CMS 不仅为本地Peer管理被共享的内容,并能浏览和下载远程Peer 的内容。
共享的内容由一个独一无二的内容 ID 以及一个内容广告表示,内容广告提供了有关被共享内容的元信息,例如名字、长度、 MIME类型以及内容描述。当然目前的 CMS 搜索机制和内容的分发机制不是很强大。
二、 CMS工作方式peer1 peer2 peer3
LI ST_REQ
l I ST_REQ
LI ST_RES( && )共享目录 内容通告
LI ST_RES( && )共享目录 内容通告
GET_REQ( )获得相应的内容
GET_REQ( )获得相应的内容
GET_RES( )包含请求内容的实际数据
GET_RES( )包含请求内容的实际数据
CMS提供的接口
1.SearchListener 类 : 针对到本机上的搜索请求进行相应;
2.ContentManager 类 : 可以共享文件和取消文件共享。
3.ListContentRequest 类:发送文件搜索请求
4.GetContentRequest 类 : 文件下载请求类
接口介绍(一)
一、 SearchListener 接口public void queryReceived()作用 :当某个 peer 发出搜索请求 ,请求到达这台机
器时 ,会激发 queryReceived(String) 方法,搜索到机器上的资源;
可以把实现该接口的类对象作为生成的 CMS 的监听者;
接口介绍(二)
ListContentRequest 抽象类(1)public void notifyMoreResults()(2)public ContentAdvertisement[] getResults()(3)public void activateRequest() 作用 : 由该类对象发出搜索请求 ,构造函数带入组名和查询字符串 ; 当更多结果到达时 方法( 1 )被调用; 方法 (2)获取搜索到的结果; 方法 (3) 用于激发搜索请求; 使用继承该抽象类的类对象,用于在组内进行制定字符串名的搜索;
接口介绍 (三 )
GetContentRequest抽象类 (1)notifyDone(): 下载完成时被调用 ; (2)notifyFailure(): 下载失败时被调用 ;
(3)notifyUpdate(int percentage): 当文件中更多的部分被下载时被调用 ;
使用继承该抽象类的对象进行文件的下载;
接口介绍 (四 )
ContentManager 类 : 作用 : 可以共享文件和取消文件共享。
(1)ContentManager.share(File file);
(2)ContentManager.unshared(File file);
开发步骤二、设计主界面
对象 类型 属性设置
属性名 属性值
search JPanel Text 搜索
share JPanel Text 共享
JLabel1 JLabel Text 搜索关键字
searchKey JTextField Text 空
JList1 JList Border TitledBorder1
Model result_listModel
JButton1 JButton Text 下载
Jbutton2 JButton Text 共享内容
JList2 JList Border TitledBorder2
Model file_listModel
Jbutton3 JButton Text 移去内容
三、搜索实现
1. MySearchListener类作用监听其它 peer 对本机上资源的搜索,实现了接口 SearchListener ,实现接口下定义的方法 queryReceived() 方法,当某个 peer 发出搜索请求 ,请求到达这台机器时 ,会激发 queryReceived(String) 方法,搜索到机器上的资源;
class MySearchListener implements SearchListener { public void queryReceived(String queryString){ System.out.println("List request with query \"" + queryString + "\" received."); } } 2.当搜索结果到达时,搜索结果以 ContentAdvertisement[] 的形式存在,我们首先将结果放到类
变量 results中 ,然后将结果显示到一个 JList的Model: result_listModel中 ; protected void updateResults(ContentAdvertisement[] results) { this.results = results; //删除原有的结果 result_listModel.removeAllElements(); //插入新的结果到 result_listMode 中 for (int i=0; i<results.length; i++) { result_listModel.addElement(results[i].getName()); } }
四、下载实现 VisibleContentRequest 文件下载类从GetContentRequest类继承并实现 ActionListener 接口 ; 成员变量: JDialog dialog: 用于显示当前下载情况 ; JProgressBar statusBar:先是当前下载进度; JButton cancelButton: 用于取消当前下载; 对GetContentRequest类中下列方法重新实现 : notifyDone(): 下载完成时被调用 notifyFailure(): 下载失败时被调用 notifyUpdate(int percentage): 当文件中更多的部分被下载时被调用 class VisibleContentRequest extends GetContentRequest implements ActionListener{ JDialog dialog; JProgressBar statusBar = new JProgressBar(); JButton cancelButton = new JButton("Stop"); public VisibleContentRequest(JFrame parent, ContentAdvertisement source , File destination){ super(netPeerGroup, source, destination); dialog = new JDialog(parent, "Downloading "+destination.getName()); dialog.setSize(240, 80); dialog.setLocation(400,400); statusBar.setStringPainted(true); dialog.getContentPane() .setLayout(new FlowLayout(FlowLayout.CENTER)); dialog.getContentPane().add(statusBar); cancelButton.addActionListener(this); dialog.getContentPane().add(cancelButton); dialog.setVisible(true); } public void actionPerformed(ActionEvent ae) { //handle the event caused by the "Stop" button being clicked if(ae.getSource() == cancelButton) { cancel(); System.out.println("download of " + getFile() + " cancelled by user."); dialog.dispose(); dialog = null; } }
四、下载实现 /** * 下载完成时被调用 */ public void notifyDone(){ System.out.println("download of "+getFile()+" done."); dialog.dispose(); dialog = null; } /** * 下载失败时被调用 */ public void notifyFailure(){ System.out.println("download of "+getFile()+" failed."); } /** * 当文件中更多的部分被下载时被调用 */ public void notifyUpdate(int percentage) { statusBar.setValue(percentage); } }
五、共享实现
1.我们首先添加一个方法 private void updateLocalFiles() 用于将当前机器的 CMS 中共享的内容显示到 jList2中 :private void updateLocalFiles(){
//ContentManager.getContent() 获取被当前 peer 共享的所有内容
Content[] content = cms.getContentManager().getContent(); //从 jList2的Model 中删除中原有的共享内容 . file_listModel.removeAllElements(); // 把当前的内容添加到 jList2 中 for (int i=0; i<content.length; i++){
file_listModel.addElement(content[i].getContentAdvertisement().getName());
} }
五、共享实现 取消原有共享内容,使用 cms.getContentManager().getContent()当前 peer 共享的文件的 ContentAdvertisement 数组,然后使用cms.getContentManager().unshared(ContentAdvertisement content)方法将原有共享的内容去除共享。
cms.getContentManager().unshared() void jButton3_actionPerformed(ActionEvent e){ try{ cms.getContentManager().unshare(cms.getContentManager().getC
ontent()[jList2.getSelectedIndex()]); } catch(IOException ex){ System.out.println(" 不能移去该共享文件 "); } this.updateLocalFiles(); } }
程序扩展
本程序还有许多不足之处,还不能共享目录。还可以继续进行扩展。