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

پیاده سازی چارچوب P2P (نسخه پایتون): | The P2P Framework Implementation (Python version):

پیاده سازی چارچوب P2P (نسخه پایتون):

این صفحه از طریق پیاده سازی کتابخانه چارچوب P2P توسط پایتون مرور می شود.

من فرض می کنم که شما با پایتون آشنا هستید.

همچنین فرض می کنم شما با مفاهیم کلی برنامه نویسی سوکت آشنا هستید ، گرچه ممکن است لزوماً از کتابخانه های شبکه یا رشته پایتون استفاده نکرده باشید.

کد منبع کامل ممکن است از اینجا بارگیری شود: btpeer.py.

شروع یک همکار:

اجازه دهید ابتدا نحوه شروع گره همتا را بررسی کنیم.

همانطور که در بالا بحث شد ، عملکرد کلی یک گره توسط کلاس Peer مدیریت می شود.

سازنده کلاس شناسه متعارف (نام) peer ، درگاهی را که برای اتصال به آن گوش می دهد و حداکثر اندازه لیست همتایان شناخته شده ای را که گره حفظ می کند ، ذخیره می کند (این می تواند 0 باشد تا اجازه داده شود تعداد نامحدود همتا در لیست).

سازنده همچنین چندین فیلد را که استفاده از آنها در زیر بخش ها توصیف می شود - خاموش کردن ، کنترل کننده ها و روتر ، مقدار دهی اولیه می کند.

تعریف زیر کد پایتون را برای انجام این کارها نشان می دهد:

هر گره همتا عملیات مشترکی را در برنامه های کلاینت شبکه و سرور سنتی انجام می دهد.

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

حلقه اصلی:

حلقه اصلی همتایان با راه اندازی سوکت شروع به شنیدن ارتباطات ورودی از سایر همسالان می کند.

برای انجام این کار ، ما باید (1) شی سوکت را ایجاد کنیم ، (2) گزینه های آن را تنظیم کنیم ، (3) آن را به پورتی متصل کنیم که برای شنیدن اتصالات در آن قرار دارد و (4) در واقع شروع به گوش دادن به اتصالات کنیم.

در اینجا یک روش پایتون وجود دارد که با انجام بازگرداندن سوکت اولیه ، این کار را انجام می دهد:

اولین عبارت سوکت ایجاد می کند که با استفاده از پروتکل IPv4 (AF_INET) با TCP (SOCK_STREAM) ارتباط برقرار می کند.

با تنظیم گزینه SO_REUSEADDR ، شماره پورت سوکت بلافاصله پس از بسته شدن سوکت مجدداً قابل استفاده خواهد بود (در غیر این صورت سیستم عامل ممکن است از استفاده مجدد پورت پس از خروج سرور تا زمانی که زمان مشخصی سپری شده است جلوگیری کند).

سپس سوکت به درگاه مشخص شده متصل شده و برای دریافت اتصالات تنظیم می شود.

پارامتر backlog نشان می دهد که چند اتصال ورودی باید در صف قرار بگیرند.

با ایجاد یک سوکت سرور ، حلقه اصلی peer به طور مداوم حلقه می زند و اتصالات را می پذیرد.

هنگامی که اتصال ورودی پذیرفته می شود ، سرور یک شی سوکت جدید دارد که برای ارسال و دریافت داده های اتصال استفاده می شود.

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

بنابراین یک حلقه اصلی برای حلقه اصلی به این شکل است:

در واقع ، ما همچنین باید خطاهایی را که ممکن است در فرآیند پذیرش اتصال رخ دهد ، کنترل کنیم و باید مکانیزمی را ارائه دهیم تا حلقه به گونه ای خوب خاتمه یابد (برای مثال ، وقتی کاربر نشان می دهد برنامه باید خارج شود )

برای انجام این کار ، ما سوکت سرور را تنظیم می کنیم که هر 2 ثانیه زمان از آن خارج شود (یک انتخاب دلخواه) و شرط خاتمه حلقه را به یک متغیر بول (خاموش کردن) وابسته می کنیم.

همچنین ، یک کنترل کننده استثنا راه اندازی کردیم تا با فشار دادن کاربر روی کلیدهای "Ctrl" + "Break" (یا "Ctrl" + "c") بتوان جلوی حلقه اصلی را گرفت.

بنابراین ، در اینجا روش اصلی mainloop وجود دارد.

روش اشکال زدایی پیام های مختلفی را به یک مکان مناسب - به عنوان مثال ، صفحه یا یک پرونده ورود به سیستم - منتقل می کند.

این مقادیر توسط سازنده برای جسم همتا شروع می شود.

مدیریت اتصال همتا:

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

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

روش handlepeer به سادگی به دنبال یک کنترل کننده مناسب برای یک پیام است ، درصورتی که پیام دیگری با شی همتا ثبت شده باشد ، آن را فراخوانی می کند.

هندپیر با محصور کردن اتصال سوکت در یک شی PeerConnection شروع می کند تا امکان ارسال / دریافت آسان و رمزگذاری / رمزگشایی پیام های P2P در سیستم فراهم شود.

سپس ، handlepeer سعی در دریافت برخی داده ها از اتصال و تعیین کار با آن دارد:

قسمت هندلرها یک فرهنگ لغت (جدول هش) است ، که از انواع پیام (رشته های 4 کاراکتری) برای نشانگرهای عملکرد نگاشت می کند.

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

پس از اتمام کار قبل از بازگشت ، هندپیر اتصال را می بندد.

بنابراین ، در اینجا تعریف کاملی از روش ارائه شده است: مسیریابی و ارسال پیام:

با استفاده از روش addrouter ، برنامه نویس با در نظر گرفتن شناسه نظیر مقصد ، می تواند یک تابع مسیریابی (یا روش) را در کلاس Peer ثبت کند تا در تصمیم گیری در مورد نحوه ارسال پیام ها کمک کند.

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

تابع مسیریابی باید سه برابر سه مقدار را برگرداند: (next-peer-id، host، port) جایی که میزبان و پورت آدرس IP peer باشد که توسط next-peer-id مشخص شده است.

اگر پیام نمی تواند مسیریابی شود ، شناسه همکار بعدی باید None باشد.

روش sendtopeer نوع پیام و داده ها را به همراه شناسه همتا مقصد می گیرد و از تابع مسیریابی برای تعیین محل ارسال پیام بعدی استفاده می کند.

اگر هیچ تابع مسیریابی توسط برنامه نویس ثبت نشده باشد ، یا اگر به دلایلی تابع مسیریابی از کار بیفتد ، روش از کار می افتد.

اگر عملکرد مسیریابی با موفقیت ترکیب میزبان / درگاهی را که پیام باید به آن ارسال شود ، بازگرداند ، sendtopeer با فراخوانی روش connectandsend در واقع اتصال به peer را انجام می دهد ، بسته بندی می کند و داده ها را ارسال می کند.

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

روش Connectandsend در آدرس IP و پورت مشخص شده به همتا متصل شده و پیامی ارسال می کند.

روش های اضافی:

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