ما هي برمجة المقبس في بايثون وكيف تتقنها؟



تعرف على ما هو Socket Programming في Python جنبًا إلى جنب مع اتصالات خادم العميل إلى جانب نقل كائنات python باستخدام pickle and sockets.

أصبح الإنترنت بلا شك 'روح الوجود' ويتسم نشاطه بـ 'الاتصالات' أو 'الشبكات'. أصبحت هذه الشبكات ممكنة باستخدام واحدة من أهم أساسيات مآخذ. تغطي هذه المقالة جميع المجالات التي تتعامل مع Socket Programming في Python. تساعدك المقابس على إجراء هذه الاتصالات ، بينما ، بلا شك ، يجعل الأمر سهلاً.

دعنا نلقي نظرة سريعة على جميع الموضوعات التي تتناولها هذه المقالة:





لماذا تستخدم المقابس؟
ما هي المقابس في بايثون؟
كيف تحقق برمجة المقبس في بايثون
ما هو الخادم؟
ما هو العميل؟
صدى العميل الخادم
اتصالات متعددة
نقل كائنات Python



لماذا تستخدم المقابس؟

المقابس هي العمود الفقري للشبكات. تجعل نقل المعلومات ممكنًا بين برنامجين أو جهازين مختلفين. على سبيل المثال ، عندما تفتح متصفحك ، فأنت كعميل تقوم بإنشاء اتصال بالخادم لنقل المعلومات.

قبل التعمق في هذا الاتصال ، دعنا أولاً نتعرف على ماهية هذه المقابس بالضبط.

ما هي المقابس؟

بشكل عام ، المقابس هي نقاط نهاية داخلية مصممة لإرسال البيانات واستقبالها. سيكون للشبكة الواحدة مآخذ توصيل ، واحد لكل جهاز أو برنامج متصل. هذه المآخذ عبارة عن مزيج من عنوان IP ومنفذ. يمكن أن يحتوي جهاز واحد على عدد 'n' من المقابس استنادًا إلى رقم المنفذ المستخدم. تتوفر منافذ مختلفة لأنواع مختلفة من البروتوكولات. ألق نظرة على الصورة التالية لمزيد من المعلومات حول بعض أرقام المنافذ الشائعة والبروتوكولات ذات الصلة:




المنافذ المشتركة- SocketProgramminginPython-Edureka

الآن بعد أن أصبحت واضحًا بشأن مفهوم المقابس ، دعنا الآن نلقي نظرة على وحدة Socket في Python:

كيفية تحقيق برمجة Socket في Python:

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

بعض الطرق المهمة هي كما يلي:

طرقوصف

socket.socket ()

تستخدم لإنشاء مآخذ توصيل (مطلوب على كل من الخادم ونهايات العميل لإنشاء مآخذ توصيل)

socket.accept ()

تستخدم لقبول الاتصال. يقوم بإرجاع زوج من القيم (conn ، address) حيث يكون conn كائن مقبس جديد لإرسال أو استقبال البيانات والعنوان هو عنوان المقبس الموجود في الطرف الآخر من الاتصال

socket.bind ()

تستخدم لربط العنوان الذي تم تحديده كمعامل

socket.close ()

تستخدم لتمييز المقبس على أنه مغلق

socket.connect ()

تستخدم للاتصال بعنوان بعيد محدد كمعامل

socket.listen ()

تمكن الخادم من قبول الاتصالات

الآن بعد أن فهمت أهمية وحدة المقبس ، دعنا ننتقل لنرى كيف يمكن أن تعمل في إنشاء خوادم وعملاء لـ Socket Programming في .

ما هو الخادم؟

الخادم هو إما برنامج أو كمبيوتر أو جهاز مخصص لإدارة موارد الشبكة. يمكن أن تكون الخوادم إما على نفس الجهاز أو الكمبيوتر أو متصلة محليًا بأجهزة وأجهزة كمبيوتر أخرى أو حتى عن بُعد. هناك أنواع مختلفة من الخوادم مثل خوادم قواعد البيانات وخوادم الشبكة وخوادم الطباعة وما إلى ذلك.

كيفية استخدام charat في جافا

تستخدم الخوادم عادةً طرقًا مثل socket.socket () و socket.bind () و socket.listen () وما إلى ذلك لإنشاء اتصال وربط مع العملاء. لنكتب الآن برنامجًا لإنشاء خادم. تأمل المثال التالي:

مثال:

import socket s = socket.socket (socket.AF_INET، socket.SOCK_STREAM) s.bind ((socket.gethostname ()، 1234)) # رقم المنفذ يمكن أن يكون أي شيء بين 0-65535 (نحن عادة نحدد المنافذ غير السابقة التي هي > 1023) s.listen (5) بينما صحيح: clt، adr = s.accept () print (f'Connection to {adr} created ') #f string عبارة عن سلسلة حرفية مسبوقة بـ f والتي # تحتوي على تعبيرات python داخل أقواس clt .send (bytes ('Socket Programming in Python'، 'utf-8')) # لإرسال معلومات إلى clientsocket

كما ترى ، فإن الضرورة الأولى لإنشاء مقبس هي استيراد وحدة المقبس. بعد ذلك يتم استخدام طريقة socket.socket () لإنشاء مقبس من جانب الخادم.

ملحوظة:

يشير AF_INET إلى العنوان من الإنترنت ويتطلب زوجًا من (المضيف ، المنفذ) حيث يمكن أن يكون المضيف إما عنوان URL لموقع ويب معين أو عنوانه ويكون رقم المنفذ عددًا صحيحًا. يتم استخدام SOCK_STREAM لإنشاء بروتوكولات TCP.

تقبل طريقة bind () معلمتين على أنهما مجموعة (مضيف ، منفذ). ومع ذلك ، من الأفضل استخدام أرقام المنافذ المكونة من 4 أرقام حيث أن الأرقام السفلية مشغولة عادةً. تسمح طريقة listen () للخادم بقبول الاتصالات. هنا ، 5 هي قائمة الانتظار للاتصالات المتعددة التي تظهر في وقت واحد. الحد الأدنى للقيمة التي يمكن تحديدها هنا هو 0 (إذا أعطيت قيمة أقل ، يتم تغييرها إلى 0). في حالة عدم تحديد أي معامل ، فإنه يأخذ المعامل الافتراضي المناسب.

ال يسمح بقبول الاتصالات إلى الأبد. 'clt' و 'adr' هما غرض العميل وعنوانه. يقوم بيان الطباعة فقط بطباعة العنوان ورقم المنفذ لمقبس العميل. أخيرًا ، يتم استخدام clt.send لإرسال البيانات بالبايت.

الآن بعد أن تم تعيين خادمنا بالكامل ، دعنا ننتقل إلى العميل.

ما هو العميل؟

العميل هو إما جهاز كمبيوتر أو برنامج يتلقى معلومات أو خدمات من الخادم. في وحدة خادم العميل ، يطلب العملاء خدمات من الخوادم. أفضل مثال على ذلك هو متصفح الويب مثل Google Chrome و Firefox وما إلى ذلك ، حيث تطلب متصفحات الويب هذه خوادم لصفحات الويب والخدمات المطلوبة وفقًا لتوجيهات المستخدم. تشمل الأمثلة الأخرى الألعاب عبر الإنترنت والمحادثات عبر الإنترنت وما إلى ذلك.

دعنا الآن نلقي نظرة على كيفية برمجة البرنامج من جانب العميل :

مثال:

import socket s = socket.socket (socket.AF_INET، socket.SOCK_STREAM) s.connect ((socket.gethostname ()، 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

تتمثل الخطوة الأولى في استيراد وحدة المقبس ثم إنشاء مأخذ كما فعلت أثناء إنشاء الخادم. بعد ذلك ، لإنشاء اتصال بين خادم العميل ، ستحتاج إلى استخدام طريقة connect () بتحديد (المضيف ، المنفذ).


ملحوظة: يتم استخدام gethostname عندما يكون العميل والخادم قيد التشغيل على نفس الكمبيوتر. (LAN - localip / WAN - publicip)

هنا ، يريد العميل تلقي بعض المعلومات من الخادم ولهذا ، تحتاج إلى استخدام طريقة recv () ويتم تخزين المعلومات في متغير msg آخر. فقط ضع في اعتبارك أن المعلومات التي يتم تمريرها ستكون بالبايت ويمكن للعميل في البرنامج أعلاه استقبال ما يصل إلى 1024 بايت (حجم المخزن المؤقت) في عملية نقل واحدة. يمكن تحديده بأي مبلغ بناءً على كمية المعلومات التي يتم نقلها.

أخيرًا ، يجب فك تشفير الرسالة الجاري نقلها وطباعتها.

الآن بعد أن أصبحت على دراية بكيفية إنشاء برامج خادم العميل ، دعنا ننتقل لنرى كيف يجب تنفيذها.

صدى العميل الخادم:

لتنفيذ هذه البرامج ، افتح موجه الأوامر ، وادخل إلى المجلد حيث أنشأت برنامج العميل والخادم ، ثم اكتب:

py server.py (هنا ، server.py هو اسم ملف الخادم ، ويمكنك أيضًا استخدام py -3.7 server.py)

بمجرد الانتهاء من ذلك ، يبدأ الخادم في العمل. لتنفيذ العميل ، افتح نافذة cmd أخرى ، واكتب:

py client.py (هنا ، client.py هو اسم ملف العميل)

الإخراج (الخادم):

تحديد مسار الفصل في جافا

(عميل)

لنجرب نفس البرنامج عن طريق تقليل حجم المخزن المؤقت إلى 7 ونرى ما هو الناتج الذي نحصل عليه:

انتاج:

كما ترى ، يتم إنهاء الاتصال بعد نقل 7 بايت. لكن هذه مشكلة لأنك لم تتلق المعلومات الكاملة وتم إغلاق الاتصال. دعنا ننتقل إلى حل هذه المشكلة.

اتصالات متعددة:

لكي يستمر الاتصال حتى يتلقى العميل المعلومات الكاملة ، يمكنك الاستفادة من حلقة while:

مثال:

import socket s = socket.socket (socket.AF_INET، socket.SOCK_STREAM) s.connect ((socket.gethostname ()، 2346)) بينما True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

بمجرد القيام بذلك ، سيتم استلام الرسالة الكاملة في 7 بايت لكل عملية نقل.

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

مثال:

Complete_info = '' بينما صحيح: msg = s.recv (7) if len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

على جانب الخادم ، استخدم طريقة close () على النحو التالي:

clt.close ()

سيكون ناتج هذا كما هو موضح في الصورة أدناه:

انتاج:



كل ما تفعله كتلة الكود أعلاه هو التحقق من حجم المعلومات وطباعتها في مخزن مؤقت من 2 بايت في كل مرة بالإضافة إلى إغلاق الاتصال بعد اكتماله.

نقل كائنات Python:

حتى هنا لديك موهبة نقل الأوتار. لكن ، Socket Programming in بايثون يسمح لك أيضًا بنقل كائنات Python أيضًا. يمكن أن تكون هذه الكائنات أي شيء مثل المجموعات ، والقواميس ، وما إلى ذلك لتحقيق ذلك ، ستحتاج إلى استيراد وحدة pickle في Python.

وحدة مخلل بايثون:

تظهر وحدة Python pickle في الصورة عندما تقوم بالفعل بتسلسل أو إلغاء تسلسل الكائنات في Python. دعونا نلقي نظرة على مثال صغير ،

مثال:

import pickle mylist = [1،2، 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

انتاج: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. '

كما ترون ، في البرنامج أعلاه ، يتم إجراء تسلسل لـ 'mylist' باستخدام وظيفة dumps () للوحدة pickle. دوّن أيضًا أن الإخراج يبدأ بالحرف 'ب' ، مما يعني أنه تم تحويله إلى بايت. في برمجة المقبس ، يمكنك تنفيذ هذه الوحدة للنقل كائنات الثعبان بين العملاء والخوادم.

كيفية استخدام وحدة pickle لنقل هياكل كائن Python؟

عند استخدام المخلل مع المقابس ، يمكنك نقل أي شيء عبر الشبكة. دعونا نكتب جانب الخادم والنظراء من جانب العميل لنقل قائمة من الخادم إلى العميل:

من جانب الخادم:

استيراد مأخذ استيراد المخلل a = 10 s = socket.socket (socket.AF_INET، socket.SOCK_STREAM) s.bind ((socket.gethostname ()، 2133)) #binding tuple s.listen (5) while True: clt، adr = s.accept () print (f'Connection to {adr} created ') m = {1:' Client '، 2:' Server '} mymsg = pickle.dumps (m) # the msg التي نريد طباعتها لاحقًا mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

هنا ، m هو قاموس هو في الأساس ملف التي يجب إرسالها من الخادم إلى العميل. يتم ذلك عن طريق إجراء تسلسل للكائن أولاً باستخدام عمليات التفريغ () ثم تحويله إلى بايت.
الآن دعونا نكتب الطرف المقابل من جانب العميل:

من جانب العميل:

استيراد المقبس استيراد المخلل a = 10 s = socket.socket (socket.AF_INET، socket.SOCK_STREAM) s.connect ((socket.gethostname ()، 2133)) بينما صحيح: complete_info = b 'rec_msg = صحيح بينما صحيح: mymsg = s.recv (10) if rec_msg: print (f'The length of message = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Recieved the full information') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b 'print (complete_info )

ستساعدنا حلقة while الأولى في تتبع الرسالة الكاملة (معلومات كاملة) بالإضافة إلى الرسالة التي يتم تلقيها (rec_msg) باستخدام المخزن المؤقت. الرسالة عن طريق ضبط rec_
بعد ذلك ، أثناء تلقي الرسالة ، كل ما أفعله هو طباعة كل جزء منها ، ويتم استلامها في مخزن مؤقت بحجم 10. يمكن أن يكون هذا الحجم أي شيء حسب اختيارك الشخصي.

بعد ذلك ، إذا كانت الرسالة المستلمة مساوية للرسالة الكاملة ، فأنا أقوم فقط بطباعة الرسالة كما تلقيت معلومات كاملة بعد ذلك قمت بإلغاء تسلسل الرسالة باستخدام الأحمال ().

إخراج البرنامج أعلاه كما يلي:

هذا يقودنا إلى نهاية هذه المقالة حول Socket Programming في Python. أتمنى أن تكون قد فهمت كل المفاهيم بوضوح.

تأكد من ممارسة أكبر قدر ممكن وإعادة تجربتك.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في مدونة 'Socket Programming in Python' وسنعاود الاتصال بك في أقرب وقت ممكن.

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