python p2p网络库

pyp2p的Python项目详细描述


BuildLinkCoverageLinkBuildLink2CoverageLink2LicenseLink

pyp2p是一个简化的网络库,用于在python中构建对等网络。这个库的设计是为了解决查找节点和绕过nat的痛苦,这样您就可以专注于编写应用程序代码。

  • 使用upnp和natpmp的自动端口转发
  • 支持TCP打孔/同时打开
  • 反向连接(告诉节点连接到您)
  • 故障保护代理(计划功能)
  • python 2(在2.7上测试-实验)&3(在3.3上测试)
  • Linux和Windows-是的

代码示例

pyp2p设计用于简单的非阻塞tcp套接字。要使用它们,应用程序必须创建一个无限循环,用于定期查找新的答复。当您寻找回复时,该软件还处理接受新连接和自动删除旧连接的问题。

库还处理构造回复,这些回复以简单列表的形式完整返回。底层的消息格式是一个简单的基于行的协议:您要发送的消息用新行终止,并在到达时完整返回,这使得调试和开发p2p协议非常简单(基于文本的协议易于调试)。

爱丽丝节点

这将在端口44444上创建一个新的侦听服务器,绑定到侦听来自LAN的连接。指定接口主要是为了确保仅从该接口进行连接。默认情况下,将从默认接口(通常是wlan0或eth0)建立连接,该接口对于在同一台计算机上模拟和测试p2p网络是不有用的。

frompyp2p.netimport*importtime#Setup Alice's p2p node.alice=Net(passive_bind="192.168.0.45",passive_port=44444,interface="eth0:2",node_type="passive",debug=1)alice.start()alice.bootstrap()alice.advertise()#Event loop.while1:forconinalice:forreplyincon:print(reply)time.sleep(1)

bob节点

此代码将与alice节点建立连接,并反复向她发送单词test。注意它们在不同的接口上,使用完全不同的IP。这对于连接到同一台计算机上的节点是必要的,因为库在以p2p模式运行时不允许net类连接到自身(对于net类,type=“p2p”)。如果希望能够重复连接到同一接口上的节点,请将类型指定为“direct”,这将生成测试代码更容易的。请注意,默认情况下类型为“p2p”。

frompyp2p.netimport*#Setup Bob's p2p node.bob=Net(passive_bind="192.168.0.44",passive_port=44445,interface="eth0:1",node_type="passive",debug=1)bob.start()bob.bootstrap()bob.advertise()#Event loop.while1:forconinbob:con.send_line("test")time.sleep(1)

直接连接

目前显示的代码适用于标准的广播/泛洪式p2p网络,其中唯一的要求是将消息发送到整个网络(如比特币和比特消息),但是如果你想做任何更复杂的事情,你需要能够直接与节点通信。

理论上,您可以指定消息的接收者并将其广播到网络以到达他们,但是这种方法对大多数人来说不太适合。所需要的是一种直接连接到具有高可靠性的节点的方法。为了支持这个函数,我们使用了unl:universal node locator的缩写。

unls描述了如何通过查看与其他节点相关的节点网络信息,并使用多种颠覆性技术(包括upnp、natpmp和tcp打孔)连接到nat、防火墙后面或同一lan上的节点。为了进一步提高此代码的可靠性:该软件还可以与kademlia dht的修补实例一起使用,以接受来自dht上其他节点的直接消息,这些节点指示该dht的连接位置。这对于连接到nat后面的节点非常有用,因为假设源是可访问的,那么它完全绕过了端口转发的需要。

frompyp2p.netimport*frompyp2p.unlimportUNLfrompyp2p.dht_msgimportDHTimporttime#Start Alice's direct server.alice_dht=DHT()alice_direct=Net(passive_bind="192.168.0.45",passive_port=44444,interface="eth0:2",net_type="direct",dht_node=alice_dht,debug=1)alice_direct.start()#Start Bob's direct server.bob_dht=DHT()bob_direct=Net(passive_bind="192.168.0.44",passive_port=44445,interface="eth0:1",net_type="direct",node_type="active",dht_node=bob_dht,debug=1)bob_direct.start()#Callbacks.defsuccess(con):print("Alice successfully connected to Bob.")con.send_line("Sup Bob.")deffailure(con):print("Alice failed to connec to Bob\a")events={"success":success,"failure":failure}#Have Alice connect to Bob.alice_direct.unl.connect(bob_direct.unl.construct(),events)#Event loop.while1:#Bob get reply.forconinbob_direct:forreplyincon:print(reply)#Alice accept con.forconinalice_direct:x=1time.sleep(0.5)

在前面的代码中,net类被用来派生一个服务器来接受来自p2p网络上的节点的连接,并管理用于广播的连接。要管理使用同一个类的直接连接,不同的是该类禁用引导和公布连接n有关引导服务器的详细信息,因为此服务是专门为接收直接连接而保留的。

依赖关系

  • 网络接口
  • NTPLIB
  • 扭曲
  • IP地址
  • 请求
  • 鼻子
  • 设置工具
  • 烟火2

安装:python3.3 setup.py install

状态:实验性,可能有错误

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
将文本文件读取到java对象数组   不支持java PageNotFound请求方法“GET”   java JDBC未选择任何数据库   java正在获取ssl。SSLHandshakeException在使用带有标头的REST客户端时发生,但在使用PostMan时可以正常工作   java测试与junit 5的接口   多线程Java Publisher服务器聊天程序   java编译错误已尝试修复,但没有成功   在TIBCO上安装java Https证书   java如何解析一个困难的问题。txt文件?   java如何使用ApachePOI3.6和ApachePOIOXML3读取pptx文件的内容。15罐?   java使用Gradle运行特定于Android的检测测试   人工智能回溯Java   用java制作螺旋桨动画   spring hibernate查询中的java日期   java读取HDFS小型分区?