这是个不错的练习,使用python开发P2P程序,或许通过这个我们可以自己搞出来一个P2P下载工具,类似于迅雷。说到迅雷,关于其原理不知道大家是否了解,如果你不了解,我想看完这篇文章,你一定会了解的。啥,你已经了解了?那就过来指点一番。
以前在java中也接触过类似的概念。一个是RMI( Remote Method Invocation)的概念,另外一个就是XML-RPC的概念。
那么什么是XML-RPC呢?它和P2P有什么关系?下面谈谈我的个人理解。
XML-RPC是一个远程过程调用(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制[摘自维基百科]。所以这个XML-RPC可以帮助我们完成远程调用的工作,即调用相邻电脑中的方法,当然前提是在相邻电脑中已经有我们编写的供远程调用的程序在运行(不管是在前台还是后台,就像迅雷一样,总是悄悄运行)。
这里还要提出来一个概念:Node,即节点。每一个电脑被为一个节点,这个只是针对每个电脑只运行一个我们通过XML-RPC编写的程序,如果电脑中同时运行了多个程序,其实每一个程序都是一个节点。有了节点这样的一个概念之后,我想大家可以想象的出来了,不同节点之间相连,形成各种复杂的网状结构。
这时每个节点可以和其他多个节点进行相连,但是我们没必要让一个节点通其他所有的节点都相连,链接太多会很乱,就像人际关系一样。那什么时候连哪些节点呢?这时就要说到P2P了,所谓P2P即指peer to peer,也就是点到点。说是点到点,你可千万别认为只是从一点到一点,因为他可能是从多点到一点,或者一点到多点。而没有固定的从哪个点到哪个点,所有的点都可以相连。
因此在下载东西方面,这样的协议就比传统的只是从某一点下载数据要快很多,资源也会多很多。
其运作流程是这样的,我打一个比方:比如小A在迅雷里下载B片,迅雷上面可以没有这个资源,但是他可以帮你从节点中找,看谁又这个资源,刚好小C电脑里有,并且在迅雷共享目录下,然后迅雷就会把小C电脑中把资源通过自己的节点传回到小A的电脑上,当然更可能的情况是直接让小A和小C相连。
大家在使用迅雷下载东西的时候肯定注意过里面有一项资源:x/xx这样的东西,我觉得,前面的那个x的意思表示当为你提供资源的节点数量,后面的那个xx表示,所有拥有该资源的节点数目,这些节点可能并不在线。
理解了基本的概念之后,再来看python中如何来实现。
可以先做一个小小的尝试:首先进入命令行,输入python,然后输入一下代码: