Τι είναι ο προγραμματισμός Socket στο Python και πώς να το κυριαρχήσετε;

Μάθετε τι είναι ο προγραμματισμός Socket στο Python μαζί με τις επικοινωνίες διακομιστή-πελάτη μαζί με τη μεταφορά αντικειμένων python χρησιμοποιώντας τουρσί και πρίζες.

Το Διαδίκτυο έχει αναμφισβήτητα γίνει η «Ψυχή της Ύπαρξης» και η δραστηριότητά του χαρακτηρίζεται από «Συνδέσεις» ή «Δίκτυα». Αυτά τα δίκτυα καθίστανται δυνατά χρησιμοποιώντας ένα από τα πιο κρίσιμα βασικά στοιχεία του Πρίζες. Αυτό το άρθρο καλύπτει όλους τους τομείς που ασχολούνται με το Socket Programming στο Python. Οι πρίζες σας βοηθούν να κάνετε αυτές τις συνδέσεις, ενώ , αναμφίβολα, το καθιστά εύκολο.



Ας ρίξουμε μια γρήγορη ματιά σε όλα τα θέματα που καλύπτονται σε αυτό το άρθρο:



Γιατί να χρησιμοποιήσετε πρίζες;
Τι είναι οι πρίζες στο Python;
Πώς να επιτύχετε προγραμματισμό Socket στο Python
Τι είναι ο διακομιστής;
Τι είναι ο πελάτης;
Echo Client-Server
Πολλαπλές επικοινωνίες
Μεταφορά αντικειμένων Python



Γιατί να χρησιμοποιήσετε πρίζες;

Οι πρίζες είναι η ραχοκοκαλιά της δικτύωσης. Καθιστούν δυνατή τη μεταφορά πληροφοριών μεταξύ δύο διαφορετικών προγραμμάτων ή συσκευών. Για παράδειγμα, όταν ανοίγετε το πρόγραμμα περιήγησής σας, ως πελάτης δημιουργείτε μια σύνδεση με το διακομιστή για τη μεταφορά πληροφοριών.

Πριν βυθιστείτε βαθύτερα σε αυτήν την επικοινωνία, ας μάθουμε πρώτα ποιες είναι ακριβώς αυτές οι πρίζες.

Τι είναι οι πρίζες;

Σε γενικές γραμμές, οι πρίζες είναι εσωτερικά τελικά σημεία που κατασκευάζονται για την αποστολή και τη λήψη δεδομένων. Ένα ενιαίο δίκτυο θα έχει δύο υποδοχές, μία για κάθε συσκευή ή πρόγραμμα επικοινωνίας. Αυτές οι πρίζες είναι ένας συνδυασμός μιας διεύθυνσης IP και μιας θύρας. Μια μεμονωμένη συσκευή μπορεί να έχει αριθμό «n» υποδοχών με βάση τον αριθμό θύρας που χρησιμοποιείται. Διαφορετικές θύρες είναι διαθέσιμες για διαφορετικούς τύπους πρωτοκόλλων. Ρίξτε μια ματιά στην παρακάτω εικόνα για περισσότερα σχετικά με ορισμένους από τους κοινούς αριθμούς θύρας και τα σχετικά πρωτόκολλα:



πώς να αντιστρέψετε έναν αριθμό στην Java


κοινές θύρες-SocketProgramminginPython-Edureka

Τώρα που είστε ξεκάθαροι για την έννοια των πριζών, ας ρίξουμε μια ματιά στην ενότητα Socket της Python:

Πώς να επιτύχετε προγραμματισμό Socket στο Python:

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

Μερικές από τις σημαντικές μεθόδους είναι οι εξής:

ΜέθοδοιΠεριγραφή

socket.socket ()

χρησιμοποιείται για τη δημιουργία υποδοχών (απαιτείται τόσο για διακομιστές όσο και για πελάτες για τη δημιουργία υποδοχών)

socket.accept ()

χρησιμοποιείται για την αποδοχή μιας σύνδεσης. Επιστρέφει ένα ζευγάρι τιμών (conn, address) όπου το conn είναι ένα νέο αντικείμενο υποδοχής για αποστολή ή λήψη δεδομένων και η διεύθυνση είναι η διεύθυνση της υποδοχής που υπάρχει στο άλλο άκρο της σύνδεσης

socket.bind ()

χρησιμοποιείται για σύνδεση στη διεύθυνση που καθορίζεται ως παράμετρος

socket.close ()

χρησιμοποιείται για την επισήμανση της υποδοχής ως κλειστή

socket.connect ()

χρησιμοποιείται για σύνδεση σε μια απομακρυσμένη διεύθυνση που καθορίζεται ως παράμετρος

socket.listen ()

επιτρέπει στον διακομιστή να δέχεται συνδέσεις

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

Τι είναι ο διακομιστής;

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

Οι διακομιστές χρησιμοποιούν συνήθως μεθόδους όπως 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) ενώ True: clt, adr = s.accept () print (f'Connection to {adr} found ') #f string είναι η κυριολεκτική συμβολοσειρά που προτάσσεται με f που # περιέχει εκφράσεις python μέσα σε τιράντες clt .send (bytes ('Socket Programming in Python', 'utf-8')) # για να στείλετε πληροφορίες στο clientocket

Όπως μπορείτε να δείτε, η πρώτη ανάγκη δημιουργίας υποδοχής είναι η εισαγωγή της μονάδας υποδοχής. Μετά από αυτό χρησιμοποιείται η μέθοδος socket.socket () για τη δημιουργία υποδοχής διακομιστή.

ΣΗΜΕΙΩΣΗ:

Το AF_INET αναφέρεται στη Διεύθυνση από το Διαδίκτυο και απαιτεί ένα ζεύγος (κεντρικός υπολογιστής, θύρα) όπου ο κεντρικός υπολογιστής μπορεί είτε να είναι μια διεύθυνση URL κάποιου συγκεκριμένου ιστότοπου είτε η διεύθυνσή του και ο αριθμός θύρας είναι ακέραιος. Το SOCK_STREAM χρησιμοποιείται για τη δημιουργία πρωτοκόλλων TCP.

Η μέθοδος bind () δέχεται δύο παραμέτρους ως tuple (host, port). Ωστόσο, είναι προτιμότερο να χρησιμοποιείτε 4-ψήφους αριθμούς θύρας, καθώς οι κατώτεροι είναι συνήθως κατειλημμένοι. Η μέθοδος ακρόασης () επιτρέπει στον διακομιστή να δέχεται συνδέσεις. Εδώ, το 5 είναι η ουρά για πολλές συνδέσεις που εμφανίζονται ταυτόχρονα. Η ελάχιστη τιμή που μπορεί να καθοριστεί εδώ είναι 0 (Εάν δώσετε μια μικρότερη τιμή, αλλάζει σε 0). Σε περίπτωση που δεν έχει καθοριστεί παράμετρος, χρειάζεται μια προεπιλεγμένη κατάλληλη.

ο επιτρέπει την αποδοχή συνδέσεων για πάντα. Τα «clt» και «adr» είναι το αντικείμενο και η διεύθυνση του πελάτη. Η δήλωση εκτύπωσης εκτυπώνει απλώς τη διεύθυνση και τον αριθμό θύρας της υποδοχής πελάτη. Τέλος, το clt.send χρησιμοποιείται για την αποστολή των δεδομένων σε byte.

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

Τι είναι πελάτης;

Ο πελάτης είναι είτε ένας υπολογιστής είτε ένα λογισμικό που λαμβάνει πληροφορίες ή υπηρεσίες από το διακομιστή. Σε μια ενότητα πελάτη-διακομιστή, οι πελάτες ζητούν υπηρεσίες από διακομιστές. Το καλύτερο παράδειγμα είναι ένα πρόγραμμα περιήγησης ιστού όπως το Google Chrome, το Firefox κ.λπ. Αυτά τα προγράμματα περιήγησης ιστού ζητούν διακομιστές ιστού για τις απαιτούμενες ιστοσελίδες και υπηρεσίες σύμφωνα με τις οδηγίες του χρήστη. Άλλα παραδείγματα περιλαμβάνουν διαδικτυακά παιχνίδια, διαδικτυακές συνομιλίες κ.λπ.

Τώρα ας ρίξουμε μια ματιά στον τρόπο κωδικοποίησης του προγράμματος από την πλευρά του πελάτη :

ΠΑΡΑΔΕΙΓΜΑ:

εισαγωγή 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 () καθορίζοντας (host, port).


ΣΗΜΕΙΩΣΗ: Το gethostname χρησιμοποιείται όταν ο πελάτης και ο διακομιστής βρίσκονται στον ίδιο υπολογιστή. (LAN - localip / WAN - publicip)

Εδώ, ο πελάτης θέλει να λάβει κάποιες πληροφορίες από το διακομιστή και γι 'αυτό, πρέπει να χρησιμοποιήσετε τη μέθοδο recv () και οι πληροφορίες αποθηκεύονται σε άλλο μεταβλητό μήνυμα. Απλώς λάβετε υπόψη ότι οι πληροφορίες που διαβιβάζονται θα είναι σε byte και ότι ο πελάτης στο παραπάνω πρόγραμμα μπορεί να λάβει έως 1024 byte (μέγεθος buffer) σε μία μόνο μεταφορά. Μπορεί να προσδιοριστεί σε οποιοδήποτε ποσό ανάλογα με το ποσό των πληροφοριών που μεταφέρονται.

Τέλος, το μήνυμα που μεταφέρεται πρέπει να αποκωδικοποιηθεί και να εκτυπωθεί.

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

Echo Client-Server:

Για να εκτελέσετε αυτά τα προγράμματα, ανοίξτε τη γραμμή εντολών, μπείτε στο φάκελο όπου έχετε δημιουργήσει το πρόγραμμα-πελάτη και διακομιστή και, στη συνέχεια, πληκτρολογήστε:

py server.py (εδώ, το server.py είναι το όνομα αρχείου του διακομιστή, μπορείτε επίσης να χρησιμοποιήσετε το py -3.7 server.py)

Μόλις γίνει αυτό, ο διακομιστής αρχίζει να λειτουργεί. Για να εκτελέσετε τον πελάτη, ανοίξτε ένα άλλο παράθυρο cmd και πληκτρολογήστε:

py client.py (εδώ, το client.py είναι το όνομα αρχείου του πελάτη)

ΕΞΟΔΟΣ (ΣΕΡΒΕΡ):

print_r σε php

(ΠΕΛΑΤΗΣ)

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

ΠΑΡΑΓΩΓΗ:

παρουσία μιας κλάσης java

Όπως μπορείτε να δείτε, η σύνδεση τερματίζεται μετά τη μεταφορά 7 byte. Αλλά αυτό είναι ένα ζήτημα επειδή δεν έχετε λάβει τις πλήρεις πληροφορίες και η σύνδεση έχει κλείσει. Ας συνεχίσουμε για να λύσουμε αυτό το ζήτημα.

Πολλαπλές επικοινωνίες:

Για να συνεχιστεί η σύνδεση έως ότου ο πελάτης λάβει τις πλήρεις πληροφορίες, μπορείτε να χρησιμοποιήσετε τον βρόχο while:

ΠΑΡΑΔΕΙΓΜΑ:

εισαγωγή socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) while True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Μόλις το κάνετε αυτό, το πλήρες μήνυμα θα ληφθεί σε 7 byte ανά μεταφορά.

Αλλά αυτή τη φορά, όπως μπορείτε να δείτε, η σύνδεση δεν τερματίζεται και δεν γνωρίζετε ποτέ πότε πρόκειται να συμβεί. Και για να προσθέσετε σε αυτό, τι γίνεται αν δεν ξέρετε πόσο μεγάλο είναι το μήνυμα ή οι πληροφορίες που θα λάβει ο πελάτης από τον διακομιστή. Σε τέτοιες περιπτώσεις, μπορείτε πραγματικά να χρησιμοποιήσετε το ακόλουθο κομμάτι κώδικα από την πλευρά του πελάτη:

ΠΑΡΑΔΕΙΓΜΑ:

complete_info = 'while True: msg = s.recv (7) if len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

Από την πλευρά του διακομιστή χρησιμοποιήστε τη μέθοδο close () ως εξής:

clt.close ()

Η έξοδος αυτού θα είναι όπως φαίνεται στην παρακάτω εικόνα:

ΠΑΡΑΓΩΓΗ:



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

Μεταφορά αντικειμένων Python:

Μέχρι εδώ έχετε μόλις την ικανότητα να μεταφέρετε χορδές. Αλλά, Socket Programming in Πύθων Σας επιτρέπει επίσης να μεταφέρετε αντικείμενα Python. Αυτά τα αντικείμενα μπορεί να είναι οτιδήποτε όπως σύνολα, πλειάδες, λεξικά κ.λπ. Για να το επιτύχετε αυτό, θα πρέπει να εισαγάγετε τη μονάδα τουρσί του Python.

Ενότητα τουρσί Python:

Η ενότητα Python pickle έρχεται σε εικόνα όταν πραγματοποιείτε σειριοποίηση ή απο-σειριοποίηση αντικειμένων στο python. Ας ρίξουμε μια ματιά σε ένα μικρό παράδειγμα,

ΠΑΡΑΔΕΙΓΜΑ:

εισαγωγή pickle mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) εκτύπωση (mymsg)

ΠΑΡΑΓΩΓΗ: b'x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. '

Όπως μπορείτε να δείτε, στο παραπάνω πρόγραμμα, το «mylist» είναι σειριακό χρησιμοποιώντας τη λειτουργία dumps () της μονάδας pickle. Σημειώστε επίσης ότι η έξοδος ξεκινά με 'b', που σημαίνει ότι μετατρέπεται σε byte. Στον προγραμματισμό υποδοχής, μπορείτε να εφαρμόσετε αυτήν τη μονάδα για μεταφορά αντικείμενα python μεταξύ πελατών και διακομιστών.

Πώς να χρησιμοποιήσετε τη μονάδα τουρσί για τη μεταφορά δομών αντικειμένων python;

Όταν χρησιμοποιείτε τουρσί μαζί με πρίζες, μπορείτε να μεταφέρετε απολύτως οτιδήποτε μέσω του δικτύου. Ας γράψουμε τον διακομιστή και τους ομολόγους του πελάτη για να μεταφέρουμε μια λίστα από τον διακομιστή στον πελάτη:

Πλευρά του διακομιστή:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) ενώ True: clt, adr = s.accept () print (f'Connection to {adr} found ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) # το μήνυμα που θέλουμε να εκτυπώσουμε αργότερα mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Εδώ, το m είναι ένα λεξικό που είναι βασικά ένα που πρέπει να σταλεί από το διακομιστή στον πελάτη. Αυτό γίνεται πρώτα με σειριοποίηση του αντικειμένου χρησιμοποιώντας dumps () και στη συνέχεια μετατρέποντάς το σε byte.
Τώρα ας γράψουμε το αντίστοιχο πελάτη:

Πελάτης:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) ενώ True: complete_info = b 'rec_msg = True ενώ True: 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 complete info') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b 'εκτύπωση (complete_info )

Το πρώτο while loop θα μας βοηθήσει να παρακολουθούμε το πλήρες μήνυμα (complete_info) καθώς και το μήνυμα που λαμβάνεται (rec_msg) χρησιμοποιώντας το buffer. το μήνυμα ρυθμίζοντας rec_
Στη συνέχεια, ενώ λαμβάνεται το μήνυμα, το μόνο που κάνω είναι να εκτυπώσω κάθε κομμάτι του, λαμβάνοντας σε ένα buffer μεγέθους 10. Αυτό το μέγεθος μπορεί να είναι οτιδήποτε ανάλογα με την προσωπική σας επιλογή.

Στη συνέχεια, εάν το ληφθέν μήνυμα είναι ίσο με το πλήρες μήνυμα, απλώς εκτυπώνω το μήνυμα ως ληφθέντες πλήρεις πληροφορίες μετά από τις οποίες απενεργοποίησα το μήνυμα χρησιμοποιώντας φορτία ().

Η έξοδος στο παραπάνω πρόγραμμα έχει ως εξής:

Αυτό μας φέρνει στο τέλος αυτού του άρθρου σχετικά με τον προγραμματισμό Socket στο Python. Ελπίζω να καταλάβατε όλες τις έννοιες με σαφήνεια.

Βεβαιωθείτε ότι εξασκείστε όσο το δυνατόν περισσότερο και επαναφέρετε την εμπειρία σας.

Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του ιστολογίου 'Socket Programming in Python' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.

Για να μάθετε σε βάθος την Python μαζί με τις διάφορες εφαρμογές της, μπορείτε να εγγραφείτε ζωντανά με υποστήριξη 24/7 και πρόσβαση σε όλη τη διάρκεια ζωής.