全部博文(436)
分类:
2010-11-05 00:20:15
网络工程Project 进度报告5
一、工作进展
1、
本周代码组主要是进行已有源码的分类阅读,针对整个软件运行期间的流程进行代码分析;P2P原理及技术组主要是将要阐述的原理及核心技术部分进行文字整理。
2、工作进度-摘要
通过本周四的小组成员讨论,代码组成员对于上一周分配的每个人的代码进行了问题总结和解决。通过小组成员间的讨论,大家的在代码语句中的问题都有了一定的明确,对于类之间如何调用以及软件工作流程也有了一定的认识,但是对于代码中Sparser类和Main类中的部分语句仍不太明白。所以下一周,代码组的任务仍然艰巨,对于原定的下一周计划可能又有所推后。
本周技术分析组已经整理好了文字阐述部分(以BT作为示例讲解)。如下:
用户如何使用BT?
从用户角度,使用BT的客户端非常简单,用户在自行安装完毕BT客户端软件后,只需要在网上查找一些提供 .torrent 文件下载的Web站点,点击torrent文件连接就可以开始下载。用户也可以直接将本地存储的torrent文件加入客户端进行文件下载。用户下载文件的速度取决于客户端能够连接的同时上传/下载该文件的用户及种子数量,也取决于用户自身拥有的带宽。
BitTorrent(BT)由哪些节点组成?
BitTorrent (简称BT)文件分布系统有下列实体组成:Web服务器、”元信息”文件(torrent文件)、跟踪(Tracker)服务器、”种子(Seed)”、终端下载者。
其中Web服务器负责发布文件信息,提供共享文件的检索和”元信息”文件的下载。
“元信息”文件是所要发布文件的摘要信息和校验信息,该文件一般都很小。元信息文件中主要包括以下信息。
--------Tracker服务器的URL地址和端口信息。
--------文件名称:可用于确定被保存的下载文件(或文件目录)的名称。
--------片段长度:用于说明文件被分割的片段的大小。 为保证文件传输的效率,BitTorrent协议将文件(除最后一个片段外)分割成长度固定的片段,片段长度以
--------片段校验码:该参数是每个片段SHA1 校验码的组合。为保证实现断点续传和文件校验,BitTorrent 协议将每个文件片段通过SHA1 算法得到一个20字节的Hash 值。这些Hash 字符串根据文件片段的顺序进行组合。
--------长度/文件:这两个参数在元信息文件中必须且只能单独存在。Length参数代表下载目标是单个文件,其值为文件的长度(以字节为单位);files参数则代表下载目标是多个文件。
为保证共享内容的有效下载,BitTorrent引入了”种子”的概念。其中”种子”是指特定共享资源的完整下载目标。
Tracker是指一个服务器程序,也称Tracker服务器。这个程序可跟踪下载或上传同一个文件的节点数目及节点相关状态信息。每个节点连上Tracker服务器,就会获得一个正在下载和上传该文件的用户的信息列表。
BT如何实现文件的传输和共享?
从系统的角度,BT要实现文件共享与传输大致可分为三个主要阶段。
(1)共享文件发布。该部分主要包括元信息文件的制作和发布过程,以及发布内容的上线,分别对应图中的1和2。元信息文件的制作由文件发布者完成,在BT系统中任何客户端都可以成为文件发布者。
(2)客户端获取下载资源。为获取下载资源,客户端首先通过Web浏览器访问BT资源网站,下载元信息文件*.torrent(该过程如图中的3所示)。通过对元信息文件的解析,客户端提取Tracker服务器的URL地址及相应的内容信息,然后开始与Tracker服务器的交互过程(该过程如图中4所示)。
(3)文件传输。该过程对应图中的5,下载节点根据节点列表中的信息与其他节点建立连接,对文件分片段进行多点传输。作为该共享资源的发布者,仅仅提供元信息文件的发布只是完成了发布工作的前半步,发布者必须将发布的实际文件上线,而且需要保持足够长的时间,直到其他下载者单独或共同将共享资源的所有块全部下载完毕为止,否则,要么因无种子服务提供而成为无实际内容的项目致使完全不能下载,要么因初始种子内容供给时间不够,而使某些块尚未分布到系统当中,从而造成下载不全。
影响BT下载速度的因素有哪些?
(1) 用户是内网(局域网)用户。内网用户大多是通过网关和代理服务器上网,下载的时候客户端不能主动连接公网上的种子和其他BT下载用户,因此普遍下载速度较慢。
(2)下载者上传速率不高。BT的激励机制中优先处理上传较快的Peer,上传速率低,下载速率就不会高。
(3) 各个运营商网络接口速率不高,上、下行的带宽不同。
(4) 种子数目少、发布者速率较低或者同时下载的人数少。发布时Seed数目的多少将影响下载速度的快慢;下载速率还与发布者的速率相关,另外下载人数越多下载速率就越快,否则,下载速度就越慢。
(5)用户防火墙的阻碍。
(6)物理连接线路问题。
二、成员分工
代码分析组:(按类分配)
王曼丽:Main
张婉娇:Sparser、XmlWriter
张子童:SwingWorker
张晓雪:file_gui
宋伟:client
唐梦楠:search_screen 、search_window
P2P原理及技术组:
尹婷、杨庭红:P2P原理及技术阐述
三、成员个人总结
宋伟:
本周自己主要看了client这个类。在阅读过程中将整个类的作用作了一个了解。首先,client类负责了界面的构造及显示工作,与此同时设置了界面上不同按钮的监听。其次,针对有关P2P网络编程部分,client类中也有相应代码:
① 创建Socket(对象client_socket)套接字;
② 存放建立连接后出现的ip和files的information 字符串2维数组
③ 同时声明一个add_on类对象connection
现在代码在运行后,table中只能显示已连接的计算机的ip地址,但其他功能(如viewfiles等)仍不能实现。就这个问题,加之现在阅读后仍存在的问题,我想这些仍需要和小组其他成员进行讨论:
首先,在建立连接的这个过程中,client需要在一个端口为7070的Listener's machine上创建套接字,而这个Listener's machine是谁?
其次,通过输入输出流,将命令等信息记录在xml文件内(有xmlWriter中的两个方法实现),在这个xml文件中,记录了用户的各种按钮请求。
重点:谁在维护着一张记录共享者ip和files的表单??xml?还是add_on?
其中,针对每个按钮的监听,自己在阅读代码和查阅API后仍有些问题:
// Out of this vector another vector is generated which consists of a files
// or folders peratining to a paricular user who was highlighted when the
// viewfiles is pressed... the delimiters used are "?".
for (int i = 1;i
{
String temp = (String)filenames.get(i);
String name = " ";
name = temp.substring(0,temp.indexOf("?"));
name = name.substring(0,information[row][1].length());
if (name.equals(information[row][1]))
{
temp = temp.substring(temp.indexOf("?")+1);
StringTokenizer st = new StringTokenizer(temp, "?");
while (st.hasMoreTokens())
{
results.add((Object)st.nextToken());
}
temp = "";
}
}
这段的作用?
问题解决:通过周四的小组讨论,上述的一部分问题得到了解决。首先,对于共享文件来说,的确需要一张类似共享表单的东西,而这部分内容并没有在已经搜索到的源码中给出,而是可能需要由使用者自己去生成。它应该是一个xml文件,里面包含了共享者的ip和共享files,而这部分并不需要使用者自己书写,而是在互联后运行程序而自动生成的一张表单。这张表单会通过流传递给每个在这个互联网络内的用户。
其次,Listener's machine并不是具体的某个谁,而是每个互联于网络内的客户端,一旦建立了连接,那么如果某个客户端需要下载某个文件,那么通过search这个文件,便可以找到与之相对应的那个拥有想下载文件的那个ip,而那个ip的拥有者便是一个Listener's machine,他会在7070端口监听所有来自互联网络内的消息。
最后,对于上述的那部分代码,我们在讨论中并没有得到相应的结果,所以还需要进一步探究了。
王曼丽:
经过这一周细看main类的代码,我将main类中所有的函数列在两张纸上,分别写上函数的关系,大体明白了流程。其中appropriatelength方法将传递数据的数组限制在1024字节,如果超过1024的字节将以数字13代替。search_request方法主要是将请求发送给对等点显示出在特定目录中所有可共享的文件,满足用户查找要求。然而为了发送请求,用建立了一个类Xmlwriter,它具有两个功能:requestFString方法、returnRequest方法。其中第一个方法是为了写入xml文件的报头,以及所要查找的文件名。通过returnRequest方法返回请求的文件。并把文件的数据file_data转化为byte型的数组,并调用appropriatelength方法将其限制成1024字节,再通过输出流传到对等点去。
如果传过来的参数是search,提取输入流将其保存在变量string中,并将其再转化为字符数组,通过文件流写入本地的response.xml文件,并通过输出流传给对等点。这就说明我自己以及和我连接的对等点均有response.xmp文件。接下来用information数组保存的是现在的用户,通过sorting将用户名进行冒泡排序。
存在的问题是关于Sparser类,它返回的向量到底是什么?在代码中的注释为xml文档生成的向量。它通过Sparser类的perform方法将本地的response.xml作为传递的函数,又调用MyContentHandler类,其中此类的startElem将添加属性到向量中,不明白属性是什么?以前的学习中并没有学习过Attribute类型的变量。
问题解决:对于Sparser类,我们在讨论中也有很多疑惑。其中的向量value便是困扰我们的一大问题。我们发现这个value出没于各个类之中,同时,通过查看其在不同类之间的作用,我们也大致了解了它的一个作用,即储存共享用户的信息。但这部分信息究竟包含什么?ip、共享文件、标志位等等。它所记录的东西可以提供下载者一个类似共享表的东西,让下载者知道谁究竟有什么。还有Attribute类问题,它所生成的对象的具体作用也并没有在这次的讨论中得到解决。
张晓雪:
本周我仔细研读了我们找的代码中的file_gui类,file_gui主要是当用户在主界面选择了再线用户后,产生另一个子界面,该界面就是被选择用户的可被传输的所有文件。该界面上包含file_open,file_search,file_close,file_upload,file_dowlond,file_listing,file_schroller,这些按钮和滚动条。
file_open主要是打开所选择的该用户的特定的文件。
file_search这个类有些问题,它提到根目录的一些情况,还提到如果不是根目录则提示不能进行测试。我不太理解。
file_close若被点击则该界面就不可见了。即关闭该用户的选择文件要求。
File_upload是用于用户上传文件的类。它也是通过建立socket连接,然后通过java的输入输出流来进行读写的。
File_download是用于下载的类。其原理与upload一致。
File_listing是用在formating这个类中,配合输入输出流的文件匹配问题,同时与file_schroller这个类结合来控制界面的格局。
这些是我读到的一些信息。我本来还想能够在与主程序脱离的情况下能够把这个界面单独运行出来,但是它需要传递一些网络的东西,包括ip地址和包等来作为一个向量参数。这个单独的一个程序无法进行。所以这些信息希望能够对整体有益。
杨庭红:
本周我做的工作就是完成核心技术的总结,并和我们小组的另外一个成员尹婷讨论。
下面内容是我的总结:
1、用户如何使用BT?
2、BitTorrent(BT)由哪些节点组成?
3、BT如何实现文件的传输和共享?
4、影响BT下载速度的因素有哪些?
以上问题都已经成功解决。
尹婷:
这周我的任务是进行P2P核心技术原理的知识总结与整理,从而为最终的展示做好准备。前两天我重新阅读整理了我们所找到的有关P2P文件传输的资料。我们的展示主要是基于BT软件的原理讲解,我和小组成员杨庭红一起分析了整理好的资料,进行了进一步的学习和资料整理。最后我们整理出一份完整的关于P2P文件共享与传输的展示资料。下面我们小组将一起进行代码的攻克,为最后的展示做最后的准备。
张子童:
上周,组长分配了我们每个人读这个下载器中的各个类,我所读的是swingworker这个类,这个类的主要功能我觉得是返回一个线程值,来提示现在的界面是否有线程在运作着,然后里面有方法和部分的代码没有非常的了解它的作用,这个我们小组讨论时会一起解决的,再有就是自己通过查JDK也知道了里面的方法的具体作用,像关键字synchronized。
具体的我没有解决的问题就是还没有很清晰地了解他在这个项目里准确的作用,以及调用的方法。再有就是SwingWorker方法里的某些作用。
问题解决:swingworker类在代码中起到的主要还是一个保证多线程下载的作用。通过这个类中的多线程,使得软件的下载速度更快。
张婉娇:
这周我们对代码进行了细致的分析,我主要负责xml文件的读取和写入这两个类。其中SParser类主要负责读取xml文件,每个用户都会有自己唯一的一个xml文件,这个文件主要负责获得在线用户信息,所有信息都存放在一个向量里,perform方法用来建立读文件的工具,子类MyContentHandler 通过继承接口 ContentHandler再由 startElement方法实现代码的解析。还有一个XmlWriter类主要负责xml文件的写入,通过xml文件来获得用户的 name1, fame, type , size, mask 等属性。主要由requestFString请求回应,responseFString响应,returnHeader返回头部,returnResponse返回响应,returnRequest返回请求,这几个方法来实现这个类。
读这两个类时,我一直在困惑他们是干什么用的,后来通过学习,我认为这个xml文件是用来获得和保存用户在线信息的,通过这两个类的实现,我们就可以知道哪个用户在线哪个用户不在线,从而实现用户之间的通信。
唐梦楠:
这一周我读了代码中search_screen和search_window这两个类,我大致了解了这两个类的功能。在运行程序出现界面后,点击Search按钮,会调用search_window类,在这个类中可以输入需要查找的file name和computer name,然后点击Search按钮就可以将你输入的关键信息在内部传递来寻找满足需求的文件,在search_screen类的界面中你可以看到符合你需求所有的文件的根目录以及电脑的IP地址。
在阅读代码的过程中我还遇到了一些小问题,比如类的调用问题,在后来的小组讨论中,我们将各自的类进行了一些介绍,从而解决了这个问题。
尽管小组讨论让我初步了解了这个程序的整体结构,但还是有一些细节问题不是很明确,所以接下来我希望可以和小组的成员进一步讨论交流,争取完全理解!
四、前期总结及后期展望
对比后三周计划中对于本周的任务规划,本周实际的工作并没有像想象中的全部完成。对于代码部分,我们还是有几点问题的,但是对于整个软件在P2P方面的实现过程已经基本了解和逐渐熟悉。所以下一周的工作在原定计划中又需要再次加入代码分析的工作。其次就是通过不断的实验来使之真正的运行起来。