TinyP2P是一个实用的点对点文件共享应用程序,由Ed Felten博士用Python语言编写而成。而它令人称奇之处,是它仅仅包含了15行代码!作者称,他写TinyP2P只是为了阐明编写点对点应用程序的难度罢了。P2P程序可以非常简单,一个熟练的程序员随便都可以写出来,所以,任何阻止他们创作的行为都将是徒劳无功的。
(每一行都多只有80个字母。第一行不算--它只起注释之用,计算机在读入的时候会忽略它)
当然,作者编写这一程序并非为了方便别人侵犯版权,他自己也不能宽恕侵犯他人版权的举动。这一程序的设计初衷并没有协助文件共享之意,它存在价值主要在于它是一个概念的实现。一个更为实用的程序速度必须更快,更安全,对连接失败的处理机制更为完善,但那一目标的实现需要更多行代码。(TinyP2P的源代码可以由下面的链接处下载)
工作原理:程序创建了一个小型的网络,可以用于一群朋友或者商业伙伴之间共享文件。它不适用于非常大的网络;相反,许多小型网络可以共存。每一个网络由一个密码保护;只有知道网络密码的人才可以访问它。(但是网络对于窃听信息的攻击者而言是毫无安全性可言的。)
程序使用标准的通讯协议:HTTP和XML-RPC。HTTP就是在网页浏览器中普遍使用的协议,XML-RPC则在提供网页服务方面被广泛应用。
程序可作为服务端,也可作为客户端。当作为服务端运行时,程序与一个网络中的其他服务端联接,共享当前目录中的所有文件,以供网络用户下载。
尽管如此,TinyP2P毕竟还使用了一个现成的XML-RPC服务端类库。另一个文件共享程序--MoleSter更令人吃惊:它仅仅由9行Perl代码构成,而且只应用了TCP协议。新版本MoleSter0.0.2以最小的形式发布:仍然是9行,但字节数少了,只有543个字节(0.0.1版为625)。
源代码:
# tinyp2p.py 1.0 (documentation at http://freedom-to-tinker.com/tinyp2p.html)
import sys, os, SimpleXMLRPCServer, xmlrpclib, re, hmac # (C) 2004, E.W. Felten
ar,pw,res = (sys.argv,lambda u:hmac.new(sys.argv[1],u).hexdigest(),re.search)
pxy,xs = (xmlrpclib.ServerProxy,SimpleXMLRPCServer.SimpleXMLRPCServer)
def ls(p=""):return filter(lambda n:(p=="")or res(p,n),os.listdir(os.getcwd()))
if ar[2]!="client": # license: http://creativecommons.org/licenses/by-nc-sa/2.0
myU,prs,srv = ("http://"+ar[3]+":"+ar[4], ar[5:],lambda x:x.serve_forever())
def pr(x=[]): return ([(y in prs) or prs.append(y) for y in x] or 1) and prs
def c(n): return ((lambda f: (f.read(), f.close()))(file(n)))[0]
f=lambda p,n,a:(p==pw(myU))and(((n==0)and pr(a))or((n==1)and [ls(a)])or c(a))
def aug(u): return ((u==myU) and pr()) or pr(pxy(u).f(pw(u),0,pr([myU])))
pr() and [aug(s) for s in aug(pr()[0])]
(lambda sv:sv.register_function(f,"f") or srv(sv))(xs((ar[3],int(ar[4]))))
for url in pxy(ar[3]).f(pw(ar[3]),0,[]):
for fn in filter(lambda n:not n in ls(), (pxy(url).f(pw(url),1,ar[4]))[0]):
(lambda fi:fi.write(pxy(url).f(pw(url),2,fn)) or fi.close())(file(fn,"wc"))