真相永远只有一个! » 日志 » 网络大作业…奋战72小时终于找到可以参考的源代码ORZ
网络大作业…奋战72小时终于找到可以参考的源代码ORZ
Jimmy 发表于 2007-12-31 11:46:23
这两天一直在忙网络大作业
还好所有的片子都停播,不然的话真得死人了…
一直想找个源代码来参考,却找了老半天(大概有72个小时)才找到真正合适的ORZ…
下面把这痛苦的3天的经历写下来…以供后人参考…
首先我想到的是找BitComet的源代码
当然马上发现这是不可能的,BitComet已经开始有商业化倾向,尽管官方网站上有非常老的版本(0.01版似乎也有),但是却没有源代码
然后想找BitTorrent的源代码,这个应该说是最正统的了
下载下来了以后发现是Python的源代码,Python完全不懂,又去找了一份Python的教程以及Bittorrent的源代码分析(似乎是来自水木的)
刚开始的时候觉得Python还行,但是看到后来越来越觉得不对劲
一个问题在很多网站上提到过,Python在定义函数的时候不需要指定参数类型,这是相当讨厌的…如果要把Python转换成C++或者JAVA的话
然后看到源代码的selectpoll.py的这句话我就绝望了(第49行)
r, w, e = select(self.rlist, self.wlist, [], timeout)
一查发现select语句是Python专门用来连接Socket的…那我怎么知道C++和JAVA是如何做的呢ORZ
于是放弃…
然后看到一个叫CTorrent的东西,发现CTorrent代码量很小,只有几百K,而且有一个牛人写了一篇长达80页的CTorrent分析,链接在这里,主页上有Word文档下载
yaoxuchen.googlepages.com/ctorrent
于是我感到很高兴,终于可以慢慢看源代码分析了
但是看着看着我突然发现个问题,CTorrent是否能在Windows下跑起来呢?后来发现CTorrent原本是建立在Linux下的,cygwin下也应该能跑
于是去搞cygwin,话说我恨网络安装,当初cygwin用下载的方式安装,装了老半天都没装好,后来上eMule去下,发现安装的镜像文件居然有700M…
开始的时候执行./configure,说我没有安装OpenSSL,于是去搞了个OpenSSL的win32版,装好后发现还是不行,于是再去搞了一个OpenSSL的源代码,直接在cygwin下装
装个那么小的东西花了巨长时间,大概有45分钟,却被告知仍然缺少OpenSSL/sha.h文件…
网上尽管有对于这个问题的讨论,却没有给出一个好的解决方案
哎。。为什么程序员个个都这样
然后偶然之中找到了一个Delphi版的BT软件,链接如下:
http://www.codepub.com/software/view-software-4126.html
介绍如下:
BTDemo.dpr, BTDemoF.pas, BTDemoF.dfm -- 一个简单的bt下载器,支持多个.torrent文件同时下载
btutils.pas -- 核心bt组件
DCP*.pas -- SHA算法源码(复制自DEC组件包)
InetUtils.pas -- 提供Internet下载的函数库
SimpleSocks.pas -- socket组件(TCP)
SortLists.pas -- 排序的List组件
ThreadTimer.pas -- 定时器与线程池
DelayLists.pas -- 一个延时5秒再释放Object的队列
FastShareMem.pas, MemPools.pas, ShareGlobals.inc -- 由ThreadTimer内部使用
Bit Torrent Specification.htm -- BT协议文档
大小也并不算太大,BTutils.pas占到了80KB,不过刚开始还是能看的
是的,也仅限于刚开始的那部分解码编码,看到后面我觉得囧了…
BTutils.pas的第1239行,我看到了一个让我曾经恐惧过的语句…
asm
PUSH ESI
PUSH EBX
MOV EBX, dst
...
这是啥…高级语言中居然出现了汇编!!!
于是开始强烈怀疑这个程序是反汇编Delphi所得到的东西,尽管这东西非常意外地是可以正常运行的(而且居然还能够撑满我的下载带宽),但是居然出现了汇编语言,实在让我不能忍…
于是开始感到绝望了,后来看到有不少人说应该到SourceForge上面去看看,查了一下果然有不少BT软件,但是有不少是“Torrent Hunter”,也就是说专门用来查找Torrent而不是下载Torrent的,还有诸如Azureus这种,尽管是我想要的JAVA但是代码量实在是太恐怖,压缩后至少也有2M以上,况且有不少人说Azureus写得根本看上去不像是java的风格…
但是SourceForge上的确有不少和torrent相关的东西,于是想,一个一个找总是找的到的吧?
先后找了如下几个:
1、Azureus,这个不提了…Interface大概就足够我看了…
2、embtor,这个似乎是中国人写的,不过只适用于ARM板ORZ(也就是说是嵌入式的BT,真是够变态了 = =)
3、JTorrentAPI,开始下载后发现源代码10M…放弃
4、TorrentLoader,可以正常的把一个Torrent文件读出来,不过也仅限于这个功能
5、libtorrent,这个似乎看上去不错,代码量也并不大,但是当我把它放到cygwin下编译时却说缺少Boost.Date什么的,网上有人装了N多插件也没解决这个问题,于是吸取CTorrent的教训,不敢碰了…
6、NTorrent,虽然是0.1.0.0版不过代码量也似乎挺大…还有GUI…
7、ABC,全称是Another Bittorrent Client,一看,python写的…
8、sharktorrent,这个看上去似乎也不错,不过作者根本没说怎么编译,那要怎么搞 = = (似乎要用到QT?可是我装了QT装了MingW什么的还是完全不行 = =)
9、SimpleBT,一看,Delphi版本!非常不错的样子…但是一上来就要我安装两个东西,还搞了我老半天,好不容易装完后,却发现ReadMe中有这样一句话
For the Core part (located in \bthd-src\),u need to first install Python 2.2.
…我吐血了。。原来Delphi只是个GUI界面么ORZ
10、Torrent Torque,又是个Delphi!而且居然有EXE文件!可是…无法正确运行…打开个Torrent就出错,有个好奇怪的Scrape,稍微修改了一下代码也不对
开始对这个世界感到绝望了…啊…未来在何方…
有没有人注意到在这上面提到过的10个东西里面唯独有一个我没详细说明
对,那就是第三个,JTorrentAPI!
API?似乎听上去就挺恐怖的…而且10M的包…
但是解压出来意外的发现,其实有个视频文件就占去4M了(这个视频文件是用来模拟下载的)
而且更重要的是,它提供了如何实现BT下载的范例!!这点相当的重要…
于是用eclipse打开创建了一个工程,然后按照它上面说的步骤来做
事实上只需要搞一个Torrent文件然后调用Client2的第6步即可
6. Download the file (funvideo05.wmw) using the bit torrent network
java jBittorrentAPI.ExampleDownloadFiles example/client2/funvideo.torrent example/client2/
后面两个参数可以自行在eclipse中设定(菜单->Run->Run...->新建一个java Application->Argument选项卡->把上面的这两个参数填进去,例如example/client2/funvideo.torrent example/client2/)
不过要注意一个问题,它给的路径似乎是有问题的!建议测试的时候还是自己用个绝对路径的好,另外注意路径中不能有诸如空格,或者“-”这种符号!(所以我说怎么都不考虑周到的…压缩包解压出来一个文件夹就有“-”ORZ)
运行后出现如下结果:
Tracker可能一开始会没有响应,等了一段时间后发现说没有Key域
查了一下Bittorrent Specification(在前面提到的那个BTDemo中有),说到:
key: Optional. An additional identification that is not shared with any users. It is intended to allow a client to prove their identity should their IP address change.
虽然是Optional的不过现在的Tracker似乎就需要了…
key的值好像是可以随机的…于是我随便取了一个2160,在PeerUpdater.java中找到这样一段话
URL source = new URL(t.announceURL + "?info_hash=" +
t.info_hash_as_url + "&peer_id=" +
Utils.byteArrayToURLString(id) + "&port="+
this.listeningPort +
"&downloaded=" + dl + "&uploaded=" + ul +
"&left=" +
left + "&key=2160&numwant=100&compact=1" + event);
就像上面那样加上key=2160即可…
于是尝试下载shin发的机械女仆第01卷rmvb,刚开始运行时要先连接Tracker,像这样:
Contact Tracker. URL source = http://bt.popgo.net:7456/announce?info_hash=%844%E1%40%C6%D1%87l5%A3Y%EA%C6%FC%94%0B%C0%2CTM&peer_id=-BE0001-O%7F-%5DEo%D3%FE%F7%C5M%CB&port=6881&downloaded=125698048&uploaded=321215570&left=12926379&key=2160&numwant=100&compact=1
{peers=[B@1ca318a, min interval=1500, private=0, incomplete=120, complete=125, interval=1800}
Peer List updated from tracker with 92 peers
这是运行了一段时间的结果:
Piece completed by 61.173.246.172:1943 : 884 (Total dl = 58.601135% )
222.71.235.76:1850 rate: 4.8ko/s
61.173.246.172:1943 rate: 1.6ko/s
58.37.208.229:3807 rate: 1.6ko/s
218.79.252.19:13173 rate: 1.6ko/s
218.19.184.170:27452 rate: 1.6ko/s
116.225.149.5:14774 rate: 1.6ko/s
222.66.194.140:1746 rate: 1.6ko/s
222.70.28.190:40655 rate: 1.6ko/s
218.1.182.113:6580 rate: 1.6ko/s
可以下载!!此时我泪流满面…
虽然说有bug,在Connection被Reset,或者socket closed的时候都会冒出一个NullPointerException,但是似乎并不影响下载
不管怎么说,终于找到可以参考的JAVA代码了…万岁!
给出个JTorrentAPI的下载链接:
http://sourceforge.net/project/platformdownload.php?group_id=186287
希望后人看到我这篇blog能有所收获…少走弯路…这样的话我这几天痛苦的经历也值得了ORZ
如果还有不清楚的地方请发邮件给我:jimmyzzxhlh@gmail.com
- » 人生ゲーム
- » 无聊透顶
- » 【焰钢】星响海 发泄文,严重BT慎入
- » 乱有感觉的大神
最新评论
-
2007-12-31 16:22:38 匿名 222.69.*.*
显然,偶什么都看不懂!嗯!
-
2007-12-31 23:54:20 匿名 124.77.*.*
ni ni~~~ 難しいよ!!!わからないもん!!!
pia飞

不要もん =。= 要用ですわ =。= -
2008-01-01 18:58:56 匿名 124.77.*.*
重来:
ni ni~~~ 難しいですわ~わからないですわ~~~おほほほほ~。。。。。。。。。。。。。。。。。。。。。。。。。。
お持ち帰り~~~ -
2008-01-08 17:20:07 匿名 58.49.*.*
囧。。很有J妈特色的作业。。以后拿这个下片看看-v-
要是你拿这个下片的话估计花的时间是平时的两倍以上。。 -
2008-01-09 13:52:54 匿名 60.166.*.*
.......
太可怕了....
太可怕了...
太可怕了...

。。。。。
-
2008-10-20 10:41:18 匿名 61.144.*.*
泪流不止啊
