Αποστολή μεταφοράς αρχείων υποδοχής Python

Python Socket File Transfer Send



Η πρόθεση αυτού του άρθρου είναι να μάθει πώς να μεταφέρετε ένα αρχείο κειμένου μέσω δικτύου μέσω προγράμματος python Το Αυτή η μεταφορά αρχείων βασίζεται σε μοντέλο πελάτη διακομιστή για χρήση προγραμματισμού υποδοχών σε python3+.

Εδώ είναι το βασικό διάγραμμα ρύθμισης για την εκτέλεση αυτού του προγράμματος.









Για λόγους απλότητας, θα καλέσουμε το σύστημα Α ως A_client και το σύστημα Β ως διακομιστή B_ σε όλο το άρθρο.



Απαιτήσεις αρχείου:

Χρειαζόμαστε server.py και αυτό το αρχείο θα πρέπει να υπάρχει στο σύστημα διακομιστή. Στην περίπτωσή μας, το server.py πρέπει να βρίσκεται στο σύστημα B_server.





Άλλα δύο αρχεία client.py και sample.txt θα πρέπει να υπάρχει στο σύστημα πελάτη. Στην περίπτωσή μας, αυτά τα δύο αρχεία θα πρέπει να υπάρχουν στο σύστημα A_client.

Υποθέσεις:

Ακολουθούν οι υποθέσεις:



  • Θα πρέπει να έχουμε δύο συστήματα Linux με τερματική πρόσβαση.
  • Προτιμώμενη γεύση Linux είναι Ubuntu Το
  • Θα πρέπει να εγκατασταθεί το Python3.
  • Και τα δύο συστήματα Linux θα πρέπει να μπορούν να κάνουν ping μεταξύ τους. Χρήση πινγκ εντολή για έλεγχο ping.
  • Ένα σύστημα πρέπει να λειτουργεί ως διακομιστής και άλλο σύστημα θα πρέπει να λειτουργεί ως πελάτης σε μια συγκεκριμένη στιγμή.

Περιορισμοί:

Πριν προχωρήσουμε περαιτέρω πρέπει να γνωρίζουμε ότι υπάρχουν ορισμένοι περιορισμοί αυτού του προγράμματος.

  • Το Python3+ πρέπει να εγκατασταθεί για την εκτέλεση αυτού του προγράμματος. Ενδέχεται να παρατηρήσετε σφάλμα ή διαφορετική συμπεριφορά εάν εκτελείται σε παλαιότερες εκδόσεις python.
  • Μόνο το αρχείο κειμένου μπορεί να μεταφερθεί μέσω αυτού του προγράμματος από τώρα. Οποιοδήποτε άλλο αρχείο μορφής που δεν περιέχει κείμενο ενδέχεται να αποτύχει.
  • Οι βασικές εξαιρέσεις προγραμματισμού έχουν αντιμετωπιστεί στο πρόγραμμα.
  • Το πρόγραμμα μπορεί να εκτελείται ή όχι σε άλλο λειτουργικό σύστημα εκτός από το Ubuntu.
  • Το αρχείο κειμένου πρέπει να είναι σύντομο από την πλευρά του πελάτη, καθώς έχει χρησιμοποιηθεί μέγεθος προσωρινής μνήμης 1024 byte.

Ρυθμίστε τις απαιτήσεις:

  • Χρειαζόμαστε τουλάχιστον ένα σύστημα 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_ και ανοίξτε ένα τερματικό. Σύντομη διακοπή για το άνοιγμα ενός τερματικού είναι 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 <IP συστήματος διακομιστή B_>>

Έχουμε παρατηρήσει ότι πρέπει να γνωρίζουμε τη διεύθυνση IP του διακομιστή. Μπορούμε να εκτελέσουμε την παρακάτω εντολή για να γνωρίζουμε τη διεύθυνση IP του συστήματος B_server.

ifconfig

Τώρα η έξοδος του συστήματος A_client θα πρέπει να είναι έτσι

################## Το παρακάτω μήνυμα λαμβάνεται από τον διακομιστή ###################
| --------------------------------- | |
Γεια Πελάτη[Διεύθυνση IP: 192.168.1.102],
** Καλώς ορίσατε στον διακομιστή **
-Υπηρέτης
| --------------------------------- | |

Βήμα 7: Τώρα μεταβείτε στον διακομιστή B_ και αναζητήστε την παρακάτω έξοδο

Το αρχείο αντιγράφηκε με επιτυχία
Ο διακομιστής διέκοψε τη σύνδεση

Βήμα 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 που σημαίνει ότι από προεπιλογή αυτός ο server.py θα πρέπει να χρησιμοποιεί python3. Ας δούμε ένα πλεονέκτημα αυτής της γραμμής.

Έχουμε εκτελέσει το server.py ή το client.py like python3. Τώρα χωρίς τη χρήση python3 μπορούμε να εκτελέσουμε το αρχείο python. Ακολουθήστε τις παρακάτω εντολές

Μετάβαση στη λειτουργία σούπερ χρήστη:

του

Δώστε όλη την άδεια στο αρχείο .py:

chmod777υπηρέτης.py

Εκτέλεση server.py:

./υπηρέτης.py εισαγωγή πρίζα
ΕισαγωγήπρίζαΒιβλιοθήκη σε πρόγραμμα pythonόπως καιεμείς θα πάμε
χρησιμοποιώπρίζα Γιασύνδεση.

μικρό = πρίζαΤοπρίζα()

Δημιουργούμε ένα αντικείμενο μικρό για πρόσβαση σε όλες τις μεθόδους πρίζας. Αυτή είναι μια έννοια OOPs.

ΛΙΜΑΝΙ= 9898

Τώρα επιλέγουμε μια θύρα όπου ο διακομιστής θα ακούει. Μπορούμε να χρησιμοποιήσουμε τη μη δεσμευμένη θύρα αντί αυτής.

μικρό.δένω(('',ΛΙΜΑΝΙ))

Χρησιμοποιούμε τη μέθοδο bind για να συνδέσουμε τη διεύθυνση IP του διακομιστή σε αυτήν τη θύρα [9898]. Μια παρατήρηση είναι ότι θα μπορούσαμε να έχουμε χρησιμοποιήσει την ακριβή διεύθυνση IP του διακομιστή στη θέση του πρώτου ορίσματος της μεθόδου δέσμευσης, αλλά επιλέγουμε να αφήσουμε κενό καθώς λειτουργεί καλά.

μικρό.δένω((διεύθυνση IP,ΛΙΜΑΝΙ))
αρχείο = Άνοιξε('recv.txt', 'wb')

Έχουμε ανοίξει ένα όνομα αρχείου recv.txt στο διακομιστή για λειτουργία εγγραφής και έχουμε δείκτη αρχείου. Αυτό απαιτείται καθώς πρέπει να αντιγράψουμε ένα αρχείο κειμένου από τον πελάτη.

ενώ Αληθής:

Ας ξεκινήσουμε ένα άπειρο βρόχο ενώ η δουλειά του διακομιστή είναι να περιμένει έως ότου ένας πελάτης επικοινωνήσει με τον διακομιστή σε αυτήν τη θύρα 9898. Αυτό λοιπόν απαιτεί βρόχο.

συν,addr=μικρό.αποδέχομαι()

Αυτός ο κωδικός είναι για να αποδέχεται κάθε εισερχόμενη αίτηση σύνδεσης από τον πελάτη. Ο Conn θα χρησιμοποιήσει συν για επικοινωνία με τον πελάτη και addr είναι η διεύθυνση IP του πελάτη που έχει στείλει αίτημα αναταραχής σε αυτόν τον διακομιστή στη θύρα 9898.

msg= ' n n| --------------------------------- | | nΓεια πελάτη [διεύθυνση IP:
'
+ προσθήκη[0]+'], n** Καλώς ορίσατε στον διακομιστή ** n-Υπηρέτης n
| --------------------------------- | | n n n'

Αυτός ο κωδικός είναι για τη δημιουργία ενός μηνύματος για αποστολή στον πελάτη. Αυτό το μήνυμα πρέπει να εκτυπωθεί στο τερματικό πελάτη. Αυτό επιβεβαιώνει ότι ο πελάτης είναι σε θέση να επικοινωνεί με το διακομιστή.

συν.στείλετε(msgκωδικοποιώ())

Τώρα έχουμε το μήνυμα έτοιμο και στη συνέχεια το στείλουμε στον πελάτη χρησιμοποιώντας αυτό συν. Αυτός ο κωδικός στέλνει πραγματικά μήνυμα στον πελάτη.

RecvData=συν.recv(1024)

Αυτός ο κωδικός λαμβάνει τυχόν δεδομένα που αποστέλλονται από την πλευρά του πελάτη. Στην περίπτωσή μας αναμένουμε το περιεχόμενο του sample.txt στο RecvData Το

ενώRecvData:

Ένας ακόμη βρόχος while με συνθήκη RecvData δεν είναι κενός. Στην περίπτωσή μας δεν είναι άδειο.

αρχείοΤογράφω(RecvData)

Μόλις έχουμε περιεχόμενο μέσα RecvData τότε γράφουμε σε αυτό το αρχείο recv.txt χρησιμοποιώντας δείκτη αρχείων αρχείο.

RecvData=συν.recv(1024)

Και πάλι προσπαθεί να λάβει εάν υπάρχουν δεδομένα από τον πελάτη. Μια φορά RecvData δεν έχει δεδομένα, ο κώδικας θα σπάσει τον βρόχο while.

αρχείοΤοΚλείσε()

Αυτό απλά θα κλείσει τον δείκτη του αρχείου καθώς τελειώσαμε με την εγγραφή αρχείων.

συν.Κλείσε()

Αυτό θα κλείσει τη σύνδεση με τον πελάτη.

Διακοπή

Αυτό πρόκειται να βγει από το άπειρο βρόχο σε B_server.

  1. client.py:
εισαγωγή sys

Εισαγωγή βιβλιοθήκης sys όπως θέλουμε να χρησιμοποιήσουμε τη διευκόλυνση επιχειρημάτων στο python.

αν (λεν(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 insdie ServerIP.

Εάν ο χρήστης δεν περάσει τουλάχιστον έναν κωδικό ορίσματος, δείχνει βοήθεια και βγαίνει από τον κώδικα.

ΛΙΜΑΝΙ= 9898

Αυτή πρέπει να είναι η ίδια θύρα όπως αναφέρεται στην πλευρά B_server.

μικρό.συνδέω-συωδεομαι((ServerIp,ΛΙΜΑΝΙ))

Αυτός ο κωδικός θα κάνει σύνδεση TCP με IP διακομιστή με αυτήν τη θύρα. Οτιδήποτε λάθος σε αυτό το ponint οδηγεί σε αστοχίες στη σύνδεση.

αρχείο = Άνοιξε('sample.txt', 'rb')

Ανοίγουμε το sample.txt σε λειτουργία ανάγνωσης για ανάγνωση μόνο περιεχομένου.

SendData= αρχείοΤοανάγνωση(1024)

Διαβάζοντας το περιεχόμενο του αρχείου και τοποθετώντας μέσα SendData μεταβλητός.

ενώSendData:

Ξεκινάμε ένα while loop if SendData έχει δεδομένα. Στην περίπτωσή μας εάν το sample.txt δεν είναι κενό θα πρέπει να έχει δεδομένα.

μικρό.στείλετε(SendData)

Τώρα μπορούμε να στείλουμε περιεχόμενο sample.txt στο διακομιστή χρησιμοποιώντας αντικείμενο υποδοχής μικρό.

SendData= αρχείοΤοανάγνωση(1024)

Ξαναδιαβάζω αν έχει μείνει κάτι. Έτσι, δεν θα υπάρχει τίποτα για ανάγνωση από το αρχείο SendData θα είναι κενό και θα βγει από το βρόχο while.

μικρό.Κλείσε()

Αυτό δεν κλείνει τη σύνδεση από την πλευρά του πελάτη.

Ubuntu Screenshots πλευρά διακομιστή

Στιγμιότυπα οθόνης Ubuntu Πλευρά πελάτη

Δοκιμασμένοι συνδυασμοί:

  • Linux ως διακομιστής και Linux ως πελάτης: PASS
  • Linux ως πελάτης και Linux ως διακομιστής: PASS
  • Linux ως διακομιστής και Windows 10 ως πελάτης: PASS
  • Linux ως client και Windows10 ως διακομιστής: PASS

Η σύσταση είναι να χρησιμοποιήσετε δύο συστήματα Linux για διακομιστή και πελάτη.

Αναμενόμενα σφάλματα:

  1. Μπορείτε να δείτε το παρακάτω σφάλμα εάν ο διακομιστής δεν εκτελείται στη θύρα 9898

Traceback (τελευταία κλήση τελευταία):

Αρχείο'client.py',γραμμή22, σε <μονάδα μέτρησης>>
μικρό.συνδέω-συωδεομαι((ServerIp,ΛΙΜΑΝΙ))
ConnectionRefusedError:[Έρνο111]Η σύνδεση αρνήθηκε
  1. Το παρακάτω σφάλμα εμφανίζεται εάν η διεύθυνση IP δεν έχει περάσει από την πλευρά του πελάτη

Τρέξτε σαν

πελάτης python3.py <διακομιστή διεύθυνση>>
  1. Το παρακάτω σφάλμα φαίνεται εάν 1stτο επιχείρημα από την πλευρά του πελάτη δεν είναι διεύθυνση 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'

Συμπέρασμα:

Χρησιμοποιώντας αυτό το πρόγραμμα μπορούμε να στείλουμε ένα απλό αρχείο κειμένου από ένα σύστημα σε άλλο σύστημα μέσω δικτύου χρησιμοποιώντας πρόγραμμα python. Αυτό μας δίνει τη βασική εκμάθηση του προγραμματισμού python και υποδοχών επίσης για την αποστολή δεδομένων μέσω δικτύου.