Network Programming

إتقان مهلة المقابس في بايثون

Spread the love

غالبًا ما تتضمن برمجة الشبكات انتظار الاتصالات، وهي عملية يمكن تحسينها بشكل كبير من خلال تنفيذ أوقات انتظار زمنية. هذا يمنع الحجب غير المحدود ويعزز متانة تطبيقاتك. سترشدك هذه المقالة خلال إدارة أوقات الانتظار الزمنية بشكل فعال في عمليات قبول مقبس Python.

محتويات

قبول المقبس ورفضه وتوقيت الانتظار الزمني

عندما يستمع الخادم إلى الاتصالات باستخدام socket.listen()، فإن socket.accept() يحجب حتى يتصل عميل. قد يكون هذا السلوك الحاجب إشكاليًا. تسمح أوقات الانتظار الزمنية للخادم بالمتابعة إذا لم تصل اتصال خلال إطار زمني محدد. على العكس، يحدث رفض الاتصال بعد إنشاء الاتصال ولكن يُعتبر غير مرغوب فيه (مثل: فشل المصادقة). هذا يختلف عن توقيت الانتظار الزمني، الذي يعالج *غياب* الاتصال.

طرق المقبس الرئيسية في Python

تعد العديد من طرق المقبس ضرورية للتعامل مع الاتصالات وأوقات الانتظار الزمنية:

  • socket.socket(): يُنشئ كائن مقبس. حدد عائلة العنوان (مثل: socket.AF_INET لـ IPv4) ونوع المقبس (مثل: socket.SOCK_STREAM لـ TCP).
  • socket.bind(): يربط المقبس بعنوان ومنفذ.
  • socket.listen(): يبدأ الاستماع إلى الاتصالات الواردة. تحدد الوسيطة قائمة الانتظار (أقصى عدد من الاتصالات في قائمة الانتظار).
  • socket.accept(): يقبل اتصالًا. يُرجع مقبسًا جديدًا للتواصل وعنوان العميل. يتم تنفيذ أوقات الانتظار الزمنية هنا.
  • socket.settimeout(): يحدد وقت انتظار زمني (بالثواني) لعمليات المقبس. 0 يُعطل أوقات الانتظار الزمنية؛ None يُعيد سلوك الحجب الافتراضي.
  • socket.close(): يُغلق المقبس.

تنفيذ أوقات انتظار قبول المقبس

يوضح هذا المثال وقت انتظار زمني على socket.accept():


import socket

def accept_with_timeout(sock, timeout_sec):
    sock.settimeout(timeout_sec)
    try:
        conn, addr = sock.accept()
        print(f"Accepted connection from {addr}")
        return conn, addr
    except socket.timeout:
        print("Accept timeout occurred.")
        return None, None
    except Exception as e:
        print(f"An error occurred: {e}")
        return None, None

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8080)) 
server_socket.listen(1)

connection, address = accept_with_timeout(server_socket, 5)

if connection:
    connection.close()

server_socket.close()

تحاول هذه الكود قبول اتصال خلال 5 ثوانٍ. يتم التقاط استثناء socket.timeout إذا لم يصل أي اتصال، مع إرجاع None. خلاف ذلك، فإنه يُرجع المقبس الجديد وعنوان العميل.

إدارة فعالة لأوقات الانتظار الزمنية

بينما يُطبق socket.settimeout() وقت انتظار زمني لعملية مقبس محددة، لا يوجد افتراض افتراضي عالمي. يتطلب كل مقبس إعداد وقت انتظار زمني فردي. ومع ذلك، يمكن لفئة مُغلفة إدارة هذا بشكل أكثر كفاءة:


import socket

class TimeoutSocket:
    def __init__(self, address, port, timeout):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.settimeout(timeout)
        self.sock.bind((address, port))
        self.sock.listen(1)

    def accept(self):
        try:
            return self.sock.accept()
        except socket.timeout:
            return None, None
        except Exception as e:
            print(f"An error occurred: {e}")
            return None, None

    def close(self):
        self.sock.close()

# Example usage:
server = TimeoutSocket('127.0.0.1', 8081, 2) 
conn, addr = server.accept()
server.close()

تُغلف فئة TimeoutSocket إنشاء المقبس وإعداد وقت الانتظار الزمني، مما يعزز الإدارة المتسقة لأوقات الانتظار الزمنية عبر مقابس متعددة.

خاتمة

إن تنفيذ أوقات الانتظار الزمنية في عمليات قبول مقبس Python أمر بالغ الأهمية لبناء تطبيقات شبكة قوية. يمنع socket.settimeout() الحجب غير المحدود، مما يسمح بالتعامل بلطف مع حالات فشل الاتصال. تعامل دائمًا مع الاستثناءات مثل socket.timeout لمنع التعطلات. يُحسّن استخدام فئة مُغلفة من إدارة أوقات الانتظار الزمنية في المشاريع الكبيرة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *