שליחת העברת קבצי Pocket 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.

הנחות:

להלן ההנחות:



  • צריכות להיות לנו שתי מערכות לינוקס עם גישה למסוף.
  • טעם לינוקס עדיף הוא אובונטו .
  • יש להתקין את Python3.
  • שתי מערכות לינוקס אמורות להיות מסוגלות לבצע פינג זה לזה. להשתמש פינג פקודה לבדוק פינג.
  • מערכת אחת צריכה לפעול כשרת ומערכת אחרת צריכה לפעול כלקוח בזמן מסוים.

מגבלות:

לפני שנמשיך הלאה עלינו לדעת שישנן כמה מגבלות של תוכנית זו.

  • יש להתקין Python3+ להפעלת תוכנית זו. אתה עשוי להבחין בשגיאה או בהתנהגות אחרת אם תריץ על גרסאות ישנות יותר של פייתון.
  • ניתן להעביר רק קובץ טקסט באמצעות תוכנית זו נכון לעכשיו. כל קובץ בפורמט אחר שאינו מכיל טקסט עלול להיכשל.
  • תוכניות חריגות בסיסיות לתכנות טופלו בתוכנית.
  • התוכנית עשויה להריץ במערכת הפעלה אחרת מאשר אובונטו.
  • קובץ הטקסט צריך להיות קצר בצד הלקוח שכן נעשה שימוש בגודל מאגר של 1024 בתים.

הגדר דרישות:

  • אנחנו צריכים לפחות מערכת לינוקס אחת כדי לנסות את התוכנית הזו. אך ההמלצה היא להשתמש בשתי מערכות לינוקס שונות המחוברות באמצעות רשת.
  • יש לחבר שתי מערכות באמצעות אתרנט או 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.py

לא אמורות להיות שגיאות ואתה אמור לראות להדפסים למטה

השרת מופיע ביציאה: 9898

שם הקובץ שהועתק יהיה recv.txt בצד השרת

שלב 4: כעת פתח מסוף במערכת A_client.

שלב 5: עבור לנתיב שבו נמצאים client.py ו- sample.txt.

שלב 6: כעת הפעל את client.py כמו להלן

לקוח python3.py <כתובת מערכת B_server>

שמנו לב שעלינו לדעת את כתובת ה- IP של השרת. אנו יכולים לבצע את הפקודה שלהלן כדי לדעת את כתובת ה- IP של מערכת B_server.

ifconfig

כעת הפלט של מערכת A_client צריך להיות כזה

################### להלן ההודעה מתקבלת מהשרת ###################
| --------------------------------- |
היי לקוח[כתובת IP: 192.168.1.102],
** ברוכים הבאים לשרת **
-שרת
| --------------------------------- |

שלב 7: עכשיו עבור אל B_server וחפש פלט מתחת

הקובץ הועתק בהצלחה
השרת סגר את החיבור

שלב 8: צריך להיות שם קובץ אחד recv.txt בתיקיית השרת. התוכן של recv.txt זה צריך להיות אותו sample.txt.

אז העתקנו בהצלחה קובץ מהלקוח לשרת דרך הרשת באמצעות תוכנית פייתון.

הסברי קוד:

ישנם שני קבצי פייתון server.py ו client.py .

שים לב שנסביר פעם אחת אם קוד זהה בתוך server.py ו- client.py.

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

זהו קו shebang כלומר, כברירת מחדל, שרת זה צריך להשתמש ב- python3. בואו נראה יתרון אחד של שורה זו.

ביצענו את server.py או client.py כמו python3. כעת ללא שימוש ב- python3 נוכל לבצע את קובץ הפייתון. בצע את הפקודות שלהלן

עבור למצב משתמש -על:

שֶׁלָה

תן את כל ההרשאה לקובץ .py:

chmod777שרת.py

הפעל את server.py:

./שרת.py יְבוּא שֶׁקַע
מייבאשֶׁקַעספרייה לתוכנית פייתוןכפי שאנחנו הולכים
להשתמששֶׁקַע לחיבור.

ש = שֶׁקַע.שֶׁקַע()

אנו יוצרים אובייקט ש כדי לגשת לכל שיטות השקע. זהו מושג OOPs.

נמל= 9898

כעת אנו בוחרים יציאה אחת בה השרת יאזין. אנו יכולים להשתמש ביציאה לא שמורה במקום זאת.

ש.לִקְשׁוֹר(('',נמל))

אנו משתמשים בשיטת bind כדי לאגד את כתובת ה- ip של השרת ליציאה [9898]. תצפית אחת היא שיכולנו להשתמש בכתובת IP מדויקת של השרת במקום הארגומנט הראשון של שיטת bind, אך אנו בוחרים להשאיר ריק מכיוון שהעבודה תקינה.

ש.לִקְשׁוֹר((כתובת ה - IP,נמל))
קוֹבֶץ = לִפְתוֹחַ('recv.txt', 'wb')

פתחנו שם קובץ אחד recv.txt בשרת למצב כתיבה וקיבלנו מצביע קבצים. זה נדרש מכיוון שעלינו להעתיק קובץ טקסט אחד מהלקוח.

בזמן נָכוֹן:

בואו נתחיל אחד אינסופי בעוד הלולאה כתפקיד השרת היא לחכות עד שלקוח מתקשר עם השרת ביציאת 9898 ההיא. אז זה בעוד לולאה נדרשת.

conn,addr=ש.לְקַבֵּל()

קוד זה הוא לקבל כל בקשת חיבור נכנסת מהלקוח. קון ישתמש conn לתקשר עם הלקוח ו addr היא כתובת ה- IP של הלקוח ששלח בקשת מהומה לשרת זה ביציאה 9898.

הודעה= ' n n| --------------------------------- | nהיי לקוח [כתובת IP:
'
+ addr[0]+'], n** ברוכים הבאים לשרת ** n-שרת n
| --------------------------------- | n n n'

קוד זה נועד ליצור הודעה לשלוח ללקוח. הודעה זו צריכה להיות מודפסת במסוף הלקוח. זה מאשר שהלקוח מסוגל לתקשר עם השרת.

conn.לִשְׁלוֹחַ(הודעהלְהַצְפִּין())

כעת יש לנו את ההודעה מוכנה ולאחר מכן שולחת אותה ללקוח באמצעות זאת conn. קוד זה למעשה שולח הודעה ללקוח.

RecvData=conn.recv(1024)

קוד זה מקבל את כל הנתונים הנשלחים מצד הלקוח. במקרה שלנו אנו מצפים לתוכן sample.txt ב RecvData .

בזמןRecvData:

לולאה אחת נוספת עם מצב RecvData אינה ריקה. במקרה שלנו זה לא ריק.

קוֹבֶץ.לִכתוֹב(RecvData)

ברגע שיש לנו תוכן בפנים RecvData אז אנחנו כותבים לקובץ הזה recv.txt באמצעות מצביע קבצים קוֹבֶץ.

RecvData=conn.recv(1024)

שוב מנסה לקבל אם יש נתונים מהלקוח. פַּעַם RecvData אין לו נתונים הקוד ישבור את לולאת ה- while.

קוֹבֶץ.סגור()

זה רק יסגור את מצביע הקבצים כשסיימנו עם כתיבת הקבצים.

conn.סגור()

פעולה זו תסגור את הקשר עם הלקוח.

לשבור

זה אמור לצאת מלולאה אינסופית ב- B_server.

  1. client.py:
יְבוּא sys

ייבוא ​​ספריית sys כפי שאנו רוצים להשתמש במתקן ארגומנטים בפייתון.

אם (len(sys.argv) > 1):
ServerIp= sys.argv[1]
אַחֵר:
הדפס(' n nרוץ כמו npython3 client.py n n')
יְצִיאָה(1)

כאשר אנו מעבירים את כתובת ה- IP של B_server לאחר שם הקובץ client.py בזמן הריצה, עלינו לתפוס את כתובת ה- IP של השרת בתוך הלקוח.

... ..if (len (sys.argv)> 1): => כדי לוודא שהמשתמש מעביר לפחות ארגומנט אחד ככתובת IP ולתפוס את כתובת ה- IP הזו. ServerIP.

אם המשתמש לא מעביר לפחות קוד ארגומנט אחד מראה עזרה ויוצא מהקוד.

נמל= 9898

זו צריכה להיות אותה יציאה כפי שהוזכר בצד B_server.

ש.לְחַבֵּר((ServerIp,נמל))

קוד זה יבצע חיבור TCP ל- IP של השרת עם אותה יציאה. כל דבר לא תקין בפונינט הזה גורם לכשלים בחיבור.

קוֹבֶץ = לִפְתוֹחַ('sample.txt', 'rb')

אנו פותחים sample.txt במצב קריאה לקריאת תוכן בלבד.

לשלוח נתונים= קוֹבֶץ.לקרוא(1024)

קריאת תוכן הקובץ והכנסה פנימה לשלוח נתונים מִשְׁתַנֶה.

בזמןלשלוח נתונים:

אנחנו מתחילים לולאה אחת אם לשלוח נתונים יש נתונים. במקרה שלנו אם sample.txt אינו ריק הוא אמור להכיל נתונים.

ש.לִשְׁלוֹחַ(לשלוח נתונים)

עכשיו נוכל לשלוח תוכן של sample.txt לשרת באמצעות אובייקט שקע ש.

לשלוח נתונים= קוֹבֶץ.לקרוא(1024)

שוב קורא אם נשאר משהו. כך שלא יהיה מה לקרוא מהקובץ לשלוח נתונים יהיה ריק וזה ייצא מלולאת while.

ש.סגור()

זה לא סוגר את החיבור מצד הלקוח.

צילומי מסך של אובונטו בצד השרת

צד הלקוח של צילומי מסך של אובונטו

שילובים שנבדקו:

  • לינוקס כשרת ו- Linux כלקוח: PASS
  • לינוקס כלקוח ולינוקס כשרת: PASS
  • לינוקס כשרת ו- Windows10 כלקוח: PASS
  • לינוקס כלקוח ו- Windows10 כשרת: PASS

ההמלצה היא להשתמש בשתי מערכות לינוקס לשרת ולקוח.

שגיאות צפויות:

  1. תוכל לראות את השגיאה שלהלן אם השרת אינו פועל ביציאת 9898

Traceback (רוב השיחות האחרונות האחרונות):

קוֹבֶץ'client.py',קַו22, ב <מודול>
ש.לְחַבֵּר((ServerIp,נמל))
ConnectionRefusedError:[ארנו111]התחברות נדחתה
  1. להלן השגיאה נראית אם כתובת ה- IP לא מועברת בצד הלקוח

רוץ כמו

לקוח python3.py <כתובת השרת>
  1. להלן השגיאה נראית אם 1רחובהטענה בצד הלקוח אינה כתובת IP

Traceback (רוב השיחות האחרונות האחרונות):

קוֹבֶץ'client.py',קַו22, ב <מודול>
ש.לְחַבֵּר((ServerIp,נמל))
שֶׁקַע.gaierror:[ארנו -2]שֵׁםאוֹשֵׁרוּתלֹאידוע
  1. להלן השגיאה נראית אם הפורט משתמש כמו 98980

Traceback (רוב השיחות האחרונות האחרונות):

קוֹבֶץ'client.py',קַו22, ב <מודול>
ש.לְחַבֵּר((ServerIp,נמל))
OverflowError: getsockaddrarg: הפורט חייב להיות0-65535.
  1. להלן השגיאה אם ​​sample.txt אינו קיים בצד הלקוח.

Traceback (רוב השיחות האחרונות האחרונות):

קוֹבֶץ'client.py',קַו25, ב <מודול>
קוֹבֶץ = לִפְתוֹחַ('sample.txt', 'rb')
FileNotFoundError:[ארנו2]אין כזהקוֹבֶץ אוֹמַדרִיך:'sample.txt'

סיכום:

באמצעות תוכנית זו אנו יכולים לשלוח קובץ טקסט פשוט ממערכת אחת למערכת אחרת באמצעות רשת באמצעות תוכנית פייתון. זה נותן לנו למידה בסיסית של תכנות פייתון ושקעים גם לשליחת נתונים דרך הרשת.