شرح مكتبة Socket في Python يبدأ بالتفريق بين عنوان الجهاز والمنفذ ونوع النقل. عنوان IP يحدد واجهة أو وجهة ضمن شبكة، والمنفذ يساعد النظام في توجيه الاتصال إلى خدمة معينة. أما TCP فيوفر تدفقًا مرتبًا من البايتات بين طرفين. يركز هذا الدرس على أدوات بسيطة لفهم هذه البيانات قبل بناء خادم وعميل، ولا يحتاج فتح منافذ على الموجه أو الاتصال بجهاز خارجي.
التجهيز والمتطلبات
# socket is included with Python.العنوان النصي والتمثيل الثنائي
السلسلة 127.0.0.1 صيغة مقروءة لعنوان IPv4 المحلي. تحول inet_aton العنوان إلى أربعة بايتات، ثم تعيد inet_ntoa الشكل النصي. البيانات الناتجة bytes وليست اسم الجهاز وليست سلسلة من الأصفار والآحاد. نعرض hex لتسهيل رؤية البايتات، فتظهر 7f000001 لهذا العنوان. استخدم عنوانًا صحيحًا وافحص الأخطاء عند معالجة إدخال المستخدم. دوال IPv4 هذه ليست بديلًا عن دعم IPv6.
اسم الجهاز واسم الخدمة
تعيد gethostname اسم المضيف الذي يراه النظام، وقد لا يكون قابلًا للوصول من جهاز آخر. ويمكن getservbyname طلب رقم منفذ مرتبط باسم خدمة مثل http وبروتوكول tcp من قاعدة خدمات النظام. هذا بحث في تعريفات محلية، ولا يثبت أن خدمة HTTP تعمل فعلًا على المنفذ أو أن الجدار الناري يسمح به. قد يغيب الاسم في بيئة مصغرة، لذلك نعالج OSError بدل افتراض وجود قاعدة كاملة.
المثال البرمجي الكامل
import socket
def describe_ipv4(address):
packed = socket.inet_aton(address)
return {"address": socket.inet_ntoa(packed), "packed_bytes": packed, "hex": packed.hex()}
if __name__ == "__main__":
print("Local hostname:", socket.gethostname())
print(describe_ipv4("127.0.0.1"))
try:
print("HTTP TCP service port:", socket.getservbyname("http", "tcp"))
except OSError:
print("Service name is not available in this system's service database")
من الأدوات إلى اتصال TCP
عند إنشاء مقبس IPv4 مع TCP تستخدم عادة AF_INET وSOCK_STREAM. يحتاج العميل عنوان الخادم ومنفذه، بينما يربط الخادم عنوانًا محليًا وينتظر اتصالات. 127.0.0.1 مناسب لتجارب الجهاز نفسه؛ ليس عنوان جهازك للآخرين على الشبكة. تختلف نتائج DNS حسب الشبكة، ولذلك لا نجعل تحليل اسم موقع خارجي شرطًا لنجاح المثال التمهيدي. تعلم أيضًا أن إرسال النص يحتاج encode وأن استقباله يعيد بايتات تحتاج تجميعًا ثم decode.
التشغيل ومسار التجربة
احفظ الكود باسم socket_intro.py، وتجنب تسمية الملف socket.py حتى لا يحجب المكتبة القياسية. شغله باستخدام python socket_intro.py وراجع الاسم والعنوان والتمثيل الست عشري. غيّر العنوان إلى عنوان IPv4 تجريبي صحيح وراقب تغير البايتات. لا تستخدم هذه الأدوات لمسح عناوين لا تملكها؛ يكفي المثال المحلي لتعلم التحويل. الخطوة التالية هي بروتوكول رسالة بسيط بين طرفين مع مهلة وإغلاق مضمون وحد واضح لحجم البيانات.
ما الفرق بين المضيف والعنوان والمنفذ؟
اسم المضيف نص قد يحل إلى عنوان أو عدة عناوين، وعنوان IP صيغة لتحديد واجهة أو وجهة في الشبكة، والمنفذ رقم يميز نقطة خدمة على ذلك العنوان. لذلك لا يكفي اسم جهاز وحده لبدء اتصال TCP؛ تحتاج منفذًا وبروتوكولًا وخدمة تستمع فعلًا. عند الاتصال بأسماء عامة يستخدم التطبيق عادة getaddrinfo لدعم أكثر من عائلة عناوين، أما المثال الحالي فيبقى عند IPv4 المحلي لتوضيح الأساس دون اعتماد خارجي.
هل كل منفذ معروف يعني خدمة موجودة؟
لا. وجود http في قاعدة الخدمات وإرجاع الرقم 80 لا يعني وجود خادم يستمع عند 127.0.0.1:80. كما يمكن لخدمة HTTP العمل على منفذ آخر وفق إعدادها. افصل التعريف الاصطلاحي للخدمة عن حالة جهاز معين. إذا أردت فحص خادم تملكه، استخدم عملية اتصال بمهلة واضحة إلى عنوانه المعروف، ولا تستنتج نجاح الوصول من اسم الخدمة أو اسم الجهاز المطبوع في الطرفية.
كيف أنتقل إلى دعم IPv6؟
ابدأ باستخدام getaddrinfo بدل افتراض أن كل عنوان أربعة أجزاء عشرية، ثم أنشئ المقبس بعائلة العنوان المعادة. قد يختلف شكل tuple للعنوان بين IPv4 وIPv6، لذلك لا تقص أو تلصق نص العنوان يدويًا. تحتاج أيضًا أن يكون الخادم مستمعًا على العائلة المناسبة وأن تسمح إعدادات الشبكة بالاتصال. تعلم هذه الفروق بعد تجربة اتصال محلي بسيط حتى لا تختلط مشكلات التسمية والنقل وتهيئة الشبكة في خطوة واحدة. ويمكن إبقاء كل تجربة في ملف مستقل لتعرف أي تغيير سبب النتيجة الجديدة عند فحص الأخطاء.
المراجع
الصور والفيديو من الشرح السابق
الكود النصي أعلاه هو النسخة المصححة؛ قد تختلف المواد المرئية السابقة في أسماء المتغيرات أو طريقة التشغيل.







