امروز سه شنبه ، ۱۴۰۱/۰۳/۰۳
بدان

کتابخانه شبکه سازی ساده برای ساخت شبکه های نظیر به نظیر در پایتون | Simplified networking library for building peer-to-peer networks in Python

کتابخانه شبکه سازی ساده برای ساخت شبکه های نظیر به نظیر در پایتون

PyP2P یک کتابخانه شبکه ساده برای ساخت شبکه های نظیر به نظیر در پایتون است.

این کتابخانه برای حل درد یافتن گره ها و دور زدن NAT ها طراحی شده است تا بتوانید بر نوشتن کد برنامه خود تمرکز کنید.

ارسال خودکار پورت با UPnP و NATPMP.

پشتیبانی از سوراخ سوراخ TCP / باز همزمان.

اتصال معکوس (به یک گره بگویید تا به شما متصل شود).

پروکسی بدون خطر (ویژگی برنامه ریزی شده).

پایتون 2 (آزمایش شده روی 2.7 - آزمایشی) و 3 (آزمایش شده در 3.3).

لینوکس و ویندوز - بله.

مثال کد:

PyP2P برای کار با سوکت های ساده غیر مسدود کننده TCP طراحی شده است.

برای استفاده از آنها ، برنامه شما باید یک حلقه بی نهایت ایجاد کند که برای جستجوی دوره ای پاسخ های جدید استفاده می شود.

همانطور که به دنبال پاسخ می گردید ، این نرم افزار همچنین پذیرش اتصالات جدید و حذف خودکار اتصالات قدیمی است.

کتابخانه همچنین پاسخ های ساختاری را مدیریت می کند ، که به صورت یک لیست ساده به طور کامل بازگردانده می شوند.

قالب پیام اصلی یک پروتکل ساده مبتنی بر خط است: پیام هایی که می خواهید بفرستید با یک خط جدید خاتمه می یابند و وقتی وارد می شوند به طور کامل برمی گردند که این امر اشکال زدایی و توسعه پروتکل های p2p را بسیار ساده می کند (پروتکل های مبتنی بر متن آسان هستند اشکال زدایی.)

گره آلیس:

با این کار یک سرور گوش دادن جدید در پورت 44444 ایجاد می شود ، که باید به ارتباطات از طریق LAN گوش دهد.

رابط کاربری بیشتر برای اطمینان از ایجاد اتصالات فقط از آن رابط مشخص شده است.

به طور پیش فرض ، اتصالات از رابط پیش فرض (معمولاً wlan0 یا eth0) برقرار می شوند که برای شبیه سازی و آزمایش شبکه P2P در همان رایانه مفید نیست.

from pyp2p.net import *
import time
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.
while 1:
    for con in alice:
        for reply in con:
            print(reply)
    time.sleep(1)

گره باب:

این کد با گره آلیس ارتباط برقرار می کند و به طور مکرر تست کلمه را برای او ارسال می کند.

توجه داشته باشید که هر دو در رابط های مختلف با IP کاملاً متفاوت چگونه هستند.

این برای اتصال به گره های موجود در همان رایانه ضروری است زیرا کتابخانه اجازه نمی دهد کلاس Net هنگام اجرا در حالت P2P به خود متصل شود (نوع = "p2p" برای کلاس Net.) اگر می خواهید بتوانید ارتباطات تکراری را به گره های موجود در همان رابط برقرار کنید ، سپس نوع "مستقیم" را مشخص کنید که تست کد را آسان می کند.

توجه داشته باشید که نوع به طور پیش فرض "p2p" است.

from pyp2p.net import *
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.

UNL ها نحوه اتصال به گره پشت NAT ، فایروال یا همان شبکه را با مشاهده اطلاعات شبکه گره ها در ارتباط با گره های دیگر و استفاده از انواع تکنیک های برانداز از جمله سوراخ سوراخ UPnP ، NATPMP و TCP ، توصیف می کنند.

برای افزایش قابلیت اطمینان بیشتر این کد: از این نرم افزار می توان به عنوان نمونه ای از Kademlia DHT برای پذیرفتن پیام های مستقیم از گره های دیگر DHT استفاده کرد که به آنها دستور می دهد دوباره به کجا متصل شود.

این برای اتصال به گره های پشت NAT بسیار مفید است زیرا با فرض در دسترس بودن منبع ، نیاز به انتقال پورت را کاملاً دور می زند.

from pyp2p.net import *
from pyp2p.unl import UNL
from pyp2p.dht_msg import DHT
import time
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()
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 Boba")
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)

در کد قبلی از کلاس Net برای تخم ریزی یک سرور برای پذیرش اتصالات از گره های موجود در شبکه p2p و مدیریت ارتباطات به منظور پخش استفاده شده است.

برای مدیریت اتصالات مستقیم که از همان کلاس استفاده شده است ، تفاوت در کلاس غیر فعال کردن بوت استرپینگ و تبلیغ جزئیات اتصال به سرور بوت استرپ است زیرا این سرویس مخصوص دریافت ارتباطات مستقیم است.