برمجة المقابس بلغة البايثون – مثال على الخادم والعميل

مرحبًا بكم أيها الطلاب! في الدورة التعليمية السابقة لنا، تحدثنا عن وحدة اختبار Python unittest. اليوم سنتناول مثالًا على برمجة مأخذ Python. سنقوم بإنشاء تطبيقات خادم وعميل برمجة مأخذ Python.

برمجة مأخذ Python

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

مثال على مأخذ Python

لقد ذكرنا سابقًا أن عميل المأخذ يُطلب بعض الموارد من خادم المأخذ ويستجيب الخادم لهذا الطلب. لذا سنقوم بتصميم نموذجين للخادم والعميل بحيث يمكن لكل منهما التواصل مع الآخر. يمكن اعتبار الخطوات مثل هذا.

  1. يتم تنفيذ برنامج خادم المأخذ Python أولاً وينتظر أي طلب
  2. سيبدأ برنامج عميل المأخذ Python المحادثة أولاً.
  3. ثم سيستجيب برنامج الخادم وفقًا لطلبات العميل.
  4. سيتم إنهاء برنامج العميل إذا قام المستخدم بإدخال رسالة “وداعًا”. سيتم أيضًا إنهاء برنامج الخادم عندما يتم إنهاء برنامج العميل، وهذا اختياري ويمكننا الاحتفاظ بتشغيل برنامج الخادم بشكل لا نهائي أو إنهائه بأمر معين في طلب العميل.

خادم المأخذ Python

نحن سوف نحفظ برنامج خادم python socket كملف socket_server.py. لاستخدام اتصال socket في python، نحتاج إلى استيراد وحدة socket. ثم، بشكل تسلسل، نحتاج إلى أداء بعض المهام لإقامة اتصال بين الخادم والعميل. يمكننا الحصول على عنوان المضيف باستخدام وظيفة socket.gethostname(). يُفضل استخدام عنوان المنفذ فوق 1024 لأن أرقام المنافذ أقل من 1024 محجوزة لبروتوكول الإنترنت القياسي. انظر إلى رمز مثال خادم python socket أدناه، ستساعدك التعليقات في فهم الشيفرة.

import socket


def server_program():
    # الحصول على اسم المضيف
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    # نظرًا بعناية. تأخذ وظيفة bind() tuple كمعامل
    server_socket.bind((host, port))  # bind host address and port together

    # تكوين عدد العملاء الذي يمكن للخادم الاستماع إليهم في وقت واحد
    server_socket.listen(2)
    conn, address = server_socket.accept()  # accept new connection
    print("Connection from: " + str(address))
    while True:
        # استقبال تيار البيانات. لن يقبل حزمة بيانات أكبر من 1024 بايت
        data = conn.recv(1024).decode()
        if not data:
            # إذا لم يتم استلام البيانات ، انقطاع
            break
        print("from connected user: " + str(data))
        data = input(' -> ')
        conn.send(data.encode())  # send data to the client

    conn.close()  # close the connection


if __name__ == '__main__':
    server_program()

إذاً، خادم python socket لدينا يعمل على المنفذ 5000 وسينتظر طلب العميل. إذا كنت ترغب في أن يستمر الخادم في التشغيل عند إغلاق اتصال العميل، ما عليك سوى إزالة شرط if وبيان الاستراحة. حلقة while في python تُستخدم لتشغيل برنامج الخادم بشكل لا نهائي والاستمرار في انتظار طلب العميل.

عميل socket في python

سنقوم بحفظ برنامج عميل مأخذ Python كملف socket_client.py. هذا البرنامج مشابه لبرنامج الخادم، باستثناء الترابط. الفارق الرئيسي بين برنامج الخادم وبرنامج العميل هو أنه في برنامج الخادم، يحتاج إلى ترابط عنوان المضيف وعنوان المنفذ معًا. انظر إلى الكود المثالي أدناه لبرنامج عميل مأخذ Python، وسيساعدك التعليق على فهم الكود.

import socket


def client_program():
    host = socket.gethostname()  # as both code is running on same pc
    port = 5000  # socket server port number

    client_socket = socket.socket()  # instantiate
    client_socket.connect((host, port))  # connect to the server

    message = input(" -> ")  # take input

    while message.lower().strip() != 'bye':
        client_socket.send(message.encode())  # send message
        data = client_socket.recv(1024).decode()  # receive response

        print('Received from server: ' + data)  # show in terminal

        message = input(" -> ")  # again take input

    client_socket.close()  # close the connection


if __name__ == '__main__':
    client_program()

مخرجات برمجة مأخذ Python

لرؤية النتائج، قم أولاً بتشغيل برنامج الخادم مأخذ البيانات. ثم قم بتشغيل برنامج العميل مأخذ البيانات. بعد ذلك، اكتب شيئًا من برنامج العميل. ثم اكتب مرة أخرى الرد من برنامج الخادم. في النهاية، اكتب وداعًا من برنامج العميل لإنهاء كلا البرنامجين. الفيديو القصير أدناه سيظهر كيف عملت التجربة على تشغيل برامج مثالية لخادم وعميل مأخذ البيانات Python على جهازي.

pankaj$ python3.6 socket_server.py 
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
 -> Hello
from connected user: How are you?
 -> Good
from connected user: Awesome!
 -> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py 
 -> Hi
Received from server: Hello
 -> How are you?
Received from server: Good
 -> Awesome!
Received from server: Ok then, bye!
 -> Bye
pankaj$

يرجى ملاحظة أن خادم المأخذ يعمل على منفذ 5000 ولكن العميل يتطلب أيضًا منفذ مأخذ للاتصال بالخادم. يتم تعيين هذا المنفذ عشوائيًا بواسطة استدعاء الاتصال من العميل. في هذه الحالة، هو 57822. هذا هو كل شيء بالنسبة لبرمجة مأخذ Python، وبرامج خادم مأخذ Python وبرنامج عميل مأخذ البيانات. المرجع: الوثائق الرسمية

Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client