Найти в Дзене
Сапбот

PyP2P. Децентрализованная, пиринговая сеть для вашего приложения

Пиринговая сеть - сеть, где все компьютеры связаны друг с другом, и сервер просто отсутствует. P.S. Весь код переведён из оригинальной документации отсюда pip install pyp2p Или для Ubuntu sudo apt install python3-pip python3 -m pip install pyp2p PyP2P был разработан для работы с простейшими сокетами TCP. Чтобы их использовать, ваша программа должна содержать бесконечный цикл который используется для ответа на входящие запросы, отвечая на новые запросы и удаляя старые. Библиотека также может отправлять запросы, которые отправляются как список. Этот формат сообщения, это упрощенный линейный протокол: сообщения которые вы отправляете, оканчиваются на пустую линию. Этот код создаст новый сервер который будет прослушивать порт 44444, назначенный на прослушивание с локальной сети. Интерфейс назначен так, что на него всегда приходят только p2p запросы. По умолчанию, все соединения в будут с стандартного интерфкйса (обычно wlan0 или eth0) что неудобно для симуляции P2P сети на одном ПК. from
Оглавление
Схема работы одноранговой сети. Источник: https://ru.wikipedia.org/
Схема работы одноранговой сети. Источник: https://ru.wikipedia.org/

Пиринговая сеть - сеть, где все компьютеры связаны друг с другом, и сервер просто отсутствует.

P.S. Весь код переведён из оригинальной документации отсюда

Установка

pip install pyp2p

Или для Ubuntu

sudo apt install python3-pip
python3 -m pip install pyp2p

Примеры кода

PyP2P был разработан для работы с простейшими сокетами TCP. Чтобы их использовать, ваша программа должна содержать бесконечный цикл который используется для ответа на входящие запросы, отвечая на новые запросы и удаляя старые.

Библиотека также может отправлять запросы, которые отправляются как список. Этот формат сообщения, это упрощенный линейный протокол: сообщения которые вы отправляете, оканчиваются на пустую линию.

ПК "Alice"

Этот код создаст новый сервер который будет прослушивать порт 44444, назначенный на прослушивание с локальной сети. Интерфейс назначен так, что на него всегда приходят только p2p запросы. По умолчанию, все соединения в будут с стандартного интерфкйса (обычно wlan0 или eth0) что неудобно для симуляции P2P сети на одном ПК.

from pyp2p.net import *

import time



#Настройка точки p2p от "Alice"

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()



#Цикл

while 1:

for con in alice:

for reply in con:

print(reply)



time.sleep(1)

ПК "Bob"

Этот код сделает подключение к ПК "Alice" и всё время отправлять слово test. Обратите внимание как этот код работает на нескольких интерфейсах, с совершенно случайными IP. Это обязательно т.к. библиотека не разрешает подключение к самому себе в режиме P2P (type="p2p" для класса Net.) Если вы хотите дублировать подключения на одном и том-же соединении, тогда выберете "direct" как тип, что сделает проверку кода быстрее. Обратите внимание что P2P, это тип по умолчанию.

from pyp2p.net import *



#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.

while 1:

for con in bob:

con.send_line("test")



time.sleep(1)

Прямое соединение

Показанный до сих пор код хорош для стандартных P2P-сетей в стиле широковещания / флудинга, где единственное требование - отправить сообщение по всей сети (например, Bitcoin и Bitmessage), но если вы хотите сделать что-то более сложное, вам понадобится возможность напрямую взаимодействовать с узлами.

Теоретически вы можете указать получателя сообщения и отправить его по сети, чтобы оно дошло до него, но для большинства людей такой подход не подходит. Необходим способ прямого подключения к узлу с высоким уровнем надежности. Для поддержки этой функции мы используем то, что называется UNL: сокращение от Universal Node Locator.

UNLS описывают, как подключиться к узлу за NAT, брандмауэром или в той же локальной сети, просматривая сетевую информацию об узлах в сопоставлении с другими узлами и используя различные методы взлома, включая UPnP, NATPMP и пробивание отверстий в протоколе TCP. Для дальнейшего повышения надежности этого кода: программное обеспечение также можно использовать с исправленным экземпляром DHT Kademlia для приема прямых сообщений от других узлов DHT, которые указывают ему, к чему подключаться обратно. Это чрезвычайно полезно для подключения к узлам, расположенным за NAT, поскольку полностью устраняет необходимость в переадресации портов при условии, что источник доступен.

from pyp2p.net import *

from pyp2p.unl import UNL

from pyp2p.dht_msg import DHT

import time





#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.

def success(con):

print("Alice successfully connected to Bob.")

con.send_line("Sup Bob.")



def failure(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.

while 1:

#Bob get reply.

for con in bob_direct:

for reply in con:

print(reply)



#Alice accept con.

for con in alice_direct:

x = 1



time.sleep(0.5)

Зависящие проекты

  • netifaces
  • ntplib
  • twisted
  • ipaddress
  • requests
  • nose
  • setuptools
  • pyroute2