إرسال نقل ملف Python Socket

Python Socket File Transfer Send



القصد من هذه المقالة هو التعلم كيفية نقل ملف نصي عبر الشبكة من خلال برنامج بيثون . يعتمد نقل الملفات هذا على نموذج عميل الخادم لاستخدام برمجة المقبس في python3 +.

فيما يلي مخطط الإعداد الأساسي لتشغيل هذا البرنامج.









للتبسيط سوف نسمي النظام A كـ A_client والنظام B كـ B_server في جميع أنحاء المقالة.



متطلبات الملف:

نحن نحتاج server.py ويجب أن يكون هذا الملف موجودًا في نظام الخادم. في حالتنا ، يجب أن يكون server.py في نظام B_server.





ملفين آخرين client.py و sample.txt يجب أن تكون موجودة في نظام العميل. في حالتنا يجب أن يكون هذان الملفان موجودين في نظام A_client.

الافتراضات:

فيما يلي الافتراضات:



  • يجب أن يكون لدينا نظامان من أنظمة Linux مع وصول طرفي.
  • نكهة لينكس المفضلة هي أوبونتو .
  • يجب تثبيت Python3.
  • يجب أن يكون كلا نظامي Linux قادرين على اختبار اتصال بعضهما البعض. يستخدم بينغ الأمر للتحقق من الأمر ping.
  • يجب أن يعمل أحد الأنظمة كخادم وأن يعمل النظام الآخر كعميل في وقت واحد معين.

محددات:

قبل المضي قدمًا ، يجب أن نعرف أن هناك بعض القيود على هذا البرنامج.

  • يجب تثبيت Python3 + لتشغيل هذا البرنامج. قد تلاحظ خطأ أو سلوكًا مختلفًا إذا تم تشغيله على إصدارات أقدم من بيثون.
  • يمكن نقل ملف نصي فقط من خلال هذا البرنامج اعتبارًا من الآن. قد يفشل أي ملف تنسيق آخر لا يحتوي على نص.
  • تم التعامل مع استثناءات البرمجة الأساسية في البرنامج.
  • قد يعمل البرنامج أو لا يعمل على نظام تشغيل آخر غير Ubuntu.
  • يجب أن يكون الملف النصي قصيرًا من جانب العميل حيث تم استخدام حجم مخزن مؤقت يبلغ 1024 بايت.

متطلبات الإعداد:

  • نحتاج إلى نظام Linux واحد على الأقل لتجربة هذا البرنامج. لكن التوصية هي استخدام نظامي Linux مختلفين متصلين عبر الشبكة.
  • يجب توصيل نظامين عبر Ethernet أو Wi-Fi أو أي اتصالات أخرى.

كود مصدر الخادم:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/server.py

كود مصدر العميل:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/client.py

كيفية تشغيل البرامج والمخرجات المتوقعة:

فيما يلي خطوات تنفيذ البرنامج.

الخطوة 1: اذهب إلى نظام B_server وافتح محطة طرفية. اختصار لفتح المحطة هو Alt + Ctrl + t.

الخطوة 2: انتقل الآن إلى المسار حيث يوجد server.py.

الخطوة 3: الآن قم بتشغيل server.py كما هو موضح أدناه

خادم python3.السنة التحضيرية

يجب ألا يكون هناك أي أخطاء ويجب أن ترى المطبوعات أدناه

يتم سرد الخادم على المنفذ: 9898

سيكون اسم الملف المنسوخ recv.txt من جانب الخادم

Step4: الآن افتح Terminal في نظام A_client.

الخطوة 5: اذهب إلى المسار حيث يوجد client.py و sample.txt.

الخطوة 6: الآن قم بتشغيل client.py كما هو موضح أدناه

عميل python3.السنة التحضيرية <B_server نظام IP>

لقد لاحظنا أننا بحاجة إلى معرفة عنوان IP الخاص بالخادم. يمكننا تنفيذ الأمر أدناه لمعرفة عنوان IP لنظام B_server.

ifconfig

الآن يجب أن يكون إخراج نظام A_client هكذا

################## تم استلام الرسالة أدناه من الخادم ###################
| --------------------------------- |
مرحبا العميل[عنوان IP: 192.168.1.102]و
** مرحبًا بك في الخادم **
-الخادم
| --------------------------------- |

Step7: انتقل الآن إلى B_server وابحث عن الإخراج أدناه

تم نسخ الملف بنجاح
أغلق الخادم الاتصال

الخطوة 8: يجب أن يكون هناك اسم ملف واحد recv.txt في مجلد الخادم. يجب أن يكون محتوى recv.txt هذا هو نفس sample.txt.

لذلك قمنا بنسخ ملف بنجاح من عميل إلى خادم عبر الشبكة من خلال برنامج Python.

تفسيرات الكود:

هناك نوعان من ملفات python server.py و client.py .

لاحظ أننا سنشرح مرة واحدة ما إذا كان أي رمز هو نفسه داخل server.py و client.py.

  1. server.py:
#! / usr / bin / env python3

هذا هو خط shebang مما يعني افتراضيًا أن هذا الخادم يجب أن يستخدم python3. دعونا نرى ميزة واحدة لهذا الخط.

لقد قمنا بتنفيذ server.py أو client.py مثل بيثون 3. الآن بدون استخدام python3 يمكننا تنفيذ ملف python. اتبع الأوامر أدناه

انتقل إلى وضع المستخدم الفائق:

إنه

امنح كل الإذن لملف .py:

chmod777الخادم.السنة التحضيرية

قم بتشغيل server.py:

./الخادم.السنة التحضيرية يستورد قابس كهرباء
استيرادقابس كهرباءمكتبة في برنامج بيثونكمانحن ذاهبون
ليستخدمقابس كهرباء لالإتصال.

س = قابس كهرباء.قابس كهرباء()

نحن نخلق كائن س للوصول إلى جميع طرق المقبس. هذا هو مفهوم OOPs.

ميناء= 9898

الآن نختار منفذًا واحدًا حيث سيستمع الخادم. يمكننا استخدام منفذ غير محجوز بدلاً من هذا.

س.ربط(('وميناء))

نستخدم طريقة الربط لربط عنوان IP للخادم بهذا المنفذ [9898]. إحدى الملاحظات هي أنه كان بإمكاننا استخدام عنوان IP الدقيق للخادم بدلاً من الوسيطة الأولى لطريقة الربط ولكننا اخترنا تركه فارغًا لأن هذا يعمل بشكل جيد.

س.ربط((عنوان IPوميناء))
ملف = افتح('recv.txt'و 'wb')

لقد فتحنا اسم ملف واحد recv.txt في الخادم لوضع الكتابة وحصلنا على مؤشر الملف. هذا مطلوب حيث يتعين علينا نسخ ملف نصي واحد من العميل.

في حين حقيقي:

لنبدأ حلقة واحدة لانهائية لأن مهمة الخادم هي الانتظار حتى يتصل العميل بالخادم على ذلك المنفذ 9898. لذلك هذه الحلقة التكرارية مطلوبة.

كونوالعنوان=س.قبول()

هذا الرمز هو لقبول أي طلب اتصال وارد من العميل. سوف تستخدم كون كون للتواصل مع العميل و العنوان هو عنوان IP للعميل الذي أرسل طلب صخب لهذا الخادم على المنفذ 9898.

msg= 'نن| --------------------------------- |نHi Client [عنوان IP:
'
+ العنوان[0]+'] ،ن** مرحبًا بك في الخادم **ن-الخادمن
| --------------------------------- |ن نن'

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

كون.يرسل(msg.ترميز())

الآن لدينا الرسالة جاهزة ، ثم نرسلها إلى العميل باستخدام ذلك كون. هذا الرمز يرسل بالفعل رسالة إلى العميل.

RecvData=كون.recv(1024)

يتلقى هذا الرمز أي بيانات يتم إرسالها من جانب العميل. في حالتنا ، نتوقع محتوى sample.txt بتنسيق RecvData .

في حينRecvData:

حلقة واحدة أخرى مع الشرط RecvData ليست فارغة. في حالتنا هذه ليست فارغة.

ملف.اكتب(RecvData)

بمجرد أن يكون لدينا محتوى بالداخل RecvData ثم نكتب إلى هذا الملف recv.txt باستخدام مؤشر الملف ملف.

RecvData=كون.recv(1024)

مرة أخرى تحاول الحصول على ما إذا كان هناك أي بيانات من العميل. مرة واحدة RecvData لايوجد لديه بيانات الكود سوف يكسر حلقة while.

ملف.أغلق()

سيؤدي هذا إلى إغلاق مؤشر الملف فقط كما ننتهي من كتابة الملف.

كون.أغلق()

سيؤدي هذا إلى إغلاق الاتصال مع العميل.

استراحة

هذا للخروج من حلقة لانهائية في B_server.

  1. client.py:
يستورد sys

استيراد مكتبة sys كما نريد استخدام وسيلة الوسيطة في بيثون.

لو (لين(sys.أرجف) > 1):
سيرفر آي بي= sys.أرجف[1]
آخر:
مطبعة('ننتشغيل مثلنpython3 client.pyنن')
خروج(1)

نظرًا لأننا نقوم بتمرير عنوان IP الخاص بـ B_server بعد اسم الملف client.py أثناء التشغيل ، نحتاج إلى التقاط عنوان IP الخاص بالخادم داخل العميل.

… ..if (len (sys.argv)> 1): => للتأكد من قيام المستخدم بتمرير وسيطة واحدة على الأقل كعنوان IP والتقاط عنوان IP هذا داخل سيرفر آي بي.

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

ميناء= 9898

يجب أن يكون هذا المنفذ هو نفسه كما هو مذكور في جانب B_server.

س.الاتصال((سيرفر آي بيوميناء))

سيقوم هذا الرمز بإجراء اتصال TCP بخادم IP باستخدام هذا المنفذ. أي خطأ في هذا ponint ينتج عنه فشل في الاتصال.

ملف = افتح('sample.txt'و 'rb')

نحن نفتح sample.txt في وضع القراءة لقراءة المحتوى فقط.

SendData= ملف.اقرأ(1024)

قراءة محتوى الملف ووضعه بالداخل SendData عامل.

في حينإرسال البيانات:

نحن نبدأ واحدة أثناء حلقة إذا SendData لديه بيانات. في حالتنا إذا لم يكن sample.txt فارغًا ، فيجب أن يحتوي على بيانات.

س.يرسل(SendData)

الآن يمكننا إرسال محتوى sample.txt إلى الخادم باستخدام كائن مأخذ س.

SendData= ملف.اقرأ(1024)

القراءة مرة أخرى إذا بقي أي شيء. لذلك لن يكون هناك شيء للقراءة من الملف SendData ستكون فارغة وستخرج من حلقة while.

س.أغلق()

هذا ليس إغلاق الاتصال من جانب العميل.

جانب الخادم Ubuntu Screenshots

Ubuntu Screenshots جانب العميل

المجموعات المختبرة:

  • Linux كخادم و Linux كعميل: PASS
  • Linux كعميل و Linux كخادم: PASS
  • Linux كخادم و Windows10 كعميل: PASS
  • Linux كعميل و Windows10 كخادم: PASS

التوصية هي استخدام نظامي Linux للخادم والعميل.

الأخطاء المتوقعة:

  1. يمكنك أن ترى الخطأ أدناه إذا كان الخادم لا يعمل على منفذ 9898

Traceback (آخر مكالمة أخيرة):

ملف'client.py'وخط22و في <وحدة>
س.الاتصال((سيرفر آي بيوميناء))
ConnectionRefusedError: خطأ[إرنو111]رفض اتصال
  1. يظهر الخطأ أدناه إذا لم يتم تمرير عنوان IP من جانب العميل

تشغيل مثل

عميل python3.السنة التحضيرية <عنوان الخادم>
  1. يظهر الخطأ أدناه إذا 1شارعالحجة من جانب العميل ليست عنوان IP

Traceback (آخر مكالمة أخيرة):

ملف'client.py'وخط22و في <وحدة>
س.الاتصال((سيرفر آي بيوميناء))
قابس كهرباء.gaierror:[إرنو -2]اسمأوالخدماتليسمعروف
  1. يظهر الخطأ أدناه إذا تم استخدام المنفذ مثل 98980

Traceback (آخر مكالمة أخيرة):

ملف'client.py'وخط22و في <وحدة>
س.الاتصال((سيرفر آي بيوميناء))
تجاوز خطأ: getockaddrarg: يجب أن يكون المنفذ0-65535.
  1. يظهر الخطأ أدناه إذا لم يكن sample.txt موجودًا في جانب العميل.

Traceback (آخر مكالمة أخيرة):

ملف'client.py'وخط25و في <وحدة>
ملف = افتح('sample.txt'و 'rb')
FileNotFoundError:[إرنو2]ليس مثلملف أوالدليل:'sample.txt'

استنتاج:

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