Mikä on Socket-ohjelmointi Pythonissa ja miten se hallitaan?



Opi, mikä on Pythonin Socket-ohjelmointi, asiakas-palvelin-viestintä sekä python-objektien siirtäminen suolakurkkua ja pistorasioita käyttämällä.

Internetistä on kiistatta tullut ”olemassaolon sielu”, ja sen toiminnalle on ominaista ”yhteydet” tai ”verkot”. Nämä verkot ovat mahdollisia käyttämällä yhtä verkon tärkeimmistä perusteista Pistorasiat. Tämä artikkeli kattaa kaikki Pythonin Socket-ohjelmoinnit. Pistorasiat auttavat sinua luomaan nämä yhteydet , epäilemättä tekee siitä helppoa.

Katsotaanpa nopeasti kaikkia tämän artikkelin aiheita:





Miksi käyttää Socketsia?
Mitä ovat Pythonin pistorasiat?
Kuinka saavuttaa Socket-ohjelmointi Pythonissa
Mikä on palvelin?
Mikä on asiakas?
Echo Client-Server
Moninkertainen viestintä
Python-objektien siirtäminen



Miksi käyttää Socketsia?

Pistorasiat ovat verkottumisen selkäranka. Ne mahdollistavat tiedonsiirron kahden eri ohjelman tai laitteen välillä. Esimerkiksi kun avaat selaimesi, sinä asiakkaana luot yhteyden palvelimeen tietojen siirtämistä varten.

Ennen kuin sukellat syvemmälle tähän viestintään, selvitämme ensin, mitkä nämä pistorasiat tarkalleen ovat.

Mitä ovat pistorasiat?

Yleisesti ottaen pistorasiat ovat sisäisiä päätepisteitä, jotka on rakennettu tietojen lähettämistä ja vastaanottamista varten. Yhdessä verkossa on kaksi liitäntää, yksi kutakin viestintälaitetta tai ohjelmaa varten. Nämä pistorasiat ovat yhdistelmä IP-osoitetta ja porttia. Yhdellä laitteella voi olla n-määrä liitäntöjä käytetyn portin numeron perusteella. Eri tyyppisille protokollille on saatavana erilaisia ​​portteja. Katsokaa seuraavaa kuvaa saadaksesi lisätietoja joistakin yleisistä porttinumeroista ja niihin liittyvistä protokollista:




yhteiset portit-SocketProgramminginPython-Edureka

Nyt kun olet selvillä pistorasioiden käsitteestä, katsotaanpa nyt Pythonin Socket-moduulia:

Kuinka saavuttaa Socket-ohjelmointi Pythonissa:

Socket-ohjelmoinnin saavuttamiseksi Pythonissa sinun on tuotava pistorasiaan moduuli tai . Tämä moduuli koostuu sisäänrakennetuista menetelmistä, joita tarvitaan pistorasioiden luomiseen ja joiden avulla he voivat olla yhteydessä toisiinsa.

Jotkut tärkeistä menetelmistä ovat seuraavat:

MenetelmätKuvaus

pistorasia. pistorasia ()

käytetään luomaan pistorasioita (vaaditaan sekä palvelimelle että asiakkaan päihin pistorasioiden luomiseen)

socket.accept ()

käytetään yhteyden vastaanottamiseen. Se palauttaa arvoparin (yhteys, osoite), jossa conn on uusi socket-objekti datan lähettämistä tai vastaanottamista varten ja osoite on yhteyden toisessa päässä olevan liitännän osoite.

socket.bind ()

käytetään sitoutumaan parametriin määritettyyn osoitteeseen

socket.close ()

käytetään merkitsemään pistoke suljetuksi

socket.connect ()

käytetään muodostamaan yhteys parametriksi määritettyyn etäosoitteeseen

socket.listen ()

jatko-todistus vs päälliköt
mahdollistaa palvelimen hyväksyä yhteydet

Nyt kun olet ymmärtänyt socket-moduulin tärkeyden, katsotaanpa, miten se voi auttaa luomaan palvelimia ja asiakkaita Socket-ohjelmointia varten .

Mikä on palvelin?

Palvelin on joko ohjelma, tietokone tai laite, joka on omistettu verkkoresurssien hallintaan. Palvelimet voivat olla joko samassa laitteessa tai tietokoneessa tai paikallisesti kytkettyinä muihin laitteisiin ja tietokoneisiin tai jopa kauko-ohjaimeen. Palvelimia on erilaisia, kuten tietokantapalvelimet, verkkopalvelimet, tulostuspalvelimet jne.

Palvelimet käyttävät tavallisesti menetelmiä, kuten socket.socket (), socket.bind (), socket.listen () jne., Yhteyden muodostamiseksi ja sitoutumiseksi asiakkaisiin. Kirjoitetaan nyt ohjelma palvelimen luomiseksi. Harkitse seuraavaa esimerkkiä:

ESIMERKKI:

tuontipistoke s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) #portin numero voi olla mikä tahansa väliltä 0-65535 (määritämme yleensä ei-hallittuja portteja, jotka ovat > 1023) s.listen (5), kun taas True: clt, adr = s.accept () print (f'Yhteys osoitteeseen {adr} perustettu ') #f merkkijono on kirjaimellinen merkkijono, joka on lisätty f: ään, joka # sisältää python-lausekkeita aaltosulkeissa clt .send (bytes ('Socket Programming in Python', 'utf-8')) #lähettää tietoja clientocketiin

Kuten näette, ensinnäkin pistorasian luominen on tuoda pistorasiamoduuli. Sen jälkeen socket.socket () -menetelmää käytetään palvelinpuolen socketin luomiseen.

HUOMAUTUS:

AF_INET viittaa Internet-osoitteeseen ja se vaatii parin (isäntä, portti), jossa isäntä voi olla joko jonkin tietyn verkkosivuston URL tai sen osoite ja portin numero on kokonaisluku. SOCK_STREAMia käytetään TCP-protokollien luomiseen.

Bind () -menetelmä hyväksyy kaksi parametria dupleksina (isäntä, portti). On kuitenkin parempi käyttää nelinumeroisia porttinumeroita, koska alemmat ovat yleensä varattuja. Kuuntelu () -menetelmän avulla palvelin voi hyväksyä yhteydet. Tässä 5 on jono useille yhteyksille, jotka syntyvät samanaikaisesti. Pienin arvo, joka voidaan määrittää tässä, on 0 (jos annat pienemmän arvon, se muutetaan arvoksi 0). Jos parametria ei ole määritetty, se tarvitsee oletusarvoisen sopivan.

sallii yhteyksien hyväksymisen ikuisesti. ”Clt” ja ”adr” ovat asiakasobjekti ja osoite. Tulostuslauseke vain tulostaa asiakkaan pistorasian osoitteen ja portin numeron. Lopuksi clt.send käytetään tietojen lähettämiseen tavuina.

Nyt kun palvelimemme on kunnossa, siirtykäämme kohti asiakasta.

Mikä on asiakas?

Asiakas on joko tietokone tai ohjelmisto, joka vastaanottaa tietoja tai palvelimia palvelimelta. Asiakas-palvelin-moduulissa asiakkaat pyytävät palveluja palvelimilta. Paras esimerkki on verkkoselain, kuten Google Chrome, Firefox jne. Nämä verkkoselaimet pyytävät Web-palvelimia vaadituilta verkkosivuilta ja palveluilta käyttäjän ohjeiden mukaan. Muita esimerkkejä ovat verkkopelit, verkkopuhelut jne.

Katsotaan nyt, miten asiakaskohtainen ohjelma koodataan :

ESIMERKKI:

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

Ensimmäinen vaihe on tuoda socket-moduuli ja luoda sitten socket aivan kuten teit palvelinta luodessasi. Sitten, kun haluat luoda yhteyden asiakas-palvelin välille, sinun on käytettävä connect () -menetelmää määrittämällä (isäntä, portti).


HUOMAUTUS: gethostname-nimeä käytetään, kun asiakas ja palvelin ovat samassa tietokoneessa. (LAN - localip / WAN - publicip)

Täällä asiakas haluaa saada joitain tietoja palvelimelta, ja tätä varten sinun on käytettävä recv () -menetelmää ja tiedot tallennetaan toiseen muuttujaan msg. Muista vain, että välitettävät tiedot ovat tavuina ja että asiakas voi yllä olevassa ohjelmassa vastaanottaa enintään 1024 tavua (puskurikoko) yhdellä siirrolla. Se voidaan määrittää mihin tahansa määrään siirrettävän tiedon määrän mukaan.

Lopuksi siirrettävä viesti tulisi purkaa ja tulostaa.

Nyt kun olet tietoinen asiakas-palvelinohjelmien luomisesta, katsotaanpa, miten ne on suoritettava.

Echo-asiakas-palvelin:

Suorita nämä ohjelmat avaamalla komentokehote, menemällä kansioon, johon olet luonut asiakas- ja palvelinohjelman, ja kirjoittamalla sitten:

py server.py (tässä server.py on palvelimen tiedostonimi, voit käyttää myös py -3.7 server.py)

Kun tämä on tehty, palvelin alkaa toimia. Suorita asiakas avaamalla toinen cmd-ikkuna ja kirjoittamalla:

py client.py (tässä client.py on asiakkaan tiedostonimi)

mikä on tyypin valu java

LÄHTÖ (PALVELIN):

(ASIAKAS)

Kokeillaan samaa ohjelmaa pienentämällä puskurin koko 7: ksi ja katsomalla, minkä tuotoksen saamme

LÄHTÖ:

Kuten näette, yhteys katkaistaan ​​7 tavun siirtämisen jälkeen. Mutta tämä on ongelma, koska et ole saanut kaikkia tietoja ja yhteys on suljettu. Jatkaamme tämän ongelman ratkaisemista.

Useita yhteyksiä:

Jotta yhteys jatkuisi, kunnes asiakas saa täydelliset tiedot, voit käyttää while-silmukkaa:

ESIMERKKI:

tuo socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) kun taas True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Kun olet tehnyt tämän, koko viesti vastaanotetaan 7 tavua siirtoa kohti.

Mutta tällä kertaa, kuten näette, yhteys ei katkea eikä koskaan tiedä milloin se tapahtuu. Ja lisätäksesi tämän, entä jos et todellakaan tiedä, kuinka suuri on viesti tai tieto, jonka asiakas saa palvelimelta. Tällaisissa tapauksissa voit itse käyttää seuraavaa koodibittiä asiakaspuolella:

ESIMERKKI:

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

Käytä palvelimen puolella close () -menetelmää seuraavasti:

clt.close ()

Tämän tulos on alla olevan kuvan mukainen:

LÄHTÖ:



Kaikki yllä oleva koodilohko on tarkistaa tiedon koko ja tulostaa se kahden tavun puskuriin kerrallaan sekä sulkea yhteys sen valmistuttua.

Python-objektien siirtäminen:

Tähän asti sinulla on juuri taito siirtää merkkijonoja. Mutta Socket-ohjelmointi Python mahdollistaa myös Python-objektien siirtämisen. Nämä objektit voivat olla mitä tahansa kuten sarjoja, tuplia, sanakirjoja jne. Tämän saavuttamiseksi sinun on tuotava Pythonin suolakurkkumoduuli.

Python-suolakurkkumoduuli:

Python-suolakurkkumoduuli tulee kuvaan, kun olet tosiasiallisesti sarjastamassa tai poistamassa sarjatoimintoa pythonissa. Katsotaanpa pieni esimerkki,

ESIMERKKI:

tuo suolakurkkumyyntilista = [1,2, 'abc'] mymsg = suolakurkku.dumps (mylist) tulosta (mymsg)

LÄHTÖ: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ”

Kuten näette, yllä olevassa ohjelmassa 'mylist' sarjoitetaan käyttäen suolakurkkumoduulin dumps () -toimintoa. Huomaa myös, että lähtö alkaa b: llä, eli se muunnetaan tavuiksi. Socket-ohjelmoinnissa voit toteuttaa tämän moduulin siirtämistä varten python-objektit asiakkaiden ja palvelinten välillä.

Kuinka käyttää suolakurkkumoduulia python-objektirakenteiden siirtämiseen?

Kun käytät suolakurkkua pistorasioiden kanssa, voit siirtää kaiken verkon kautta. Kirjoitetaan palvelin- ja asiakaspuolen kollegat muistiin luettelon siirtämiseksi palvelimelta asiakkaalle:

Palvelimen puolella:

tuontipistoke tuoksukurkkua a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.listen (5) kun True: clt, adr = s.accept () tulosta (f'Yhteys osoitteeseen {adr} muodostettu ') m = {1:' Asiakas ', 2:' Palvelin '} mymsg = pickle.dumps (m) #viesti, jonka haluamme tulostaa myöhemmin mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt. lähetä (mymsg)

Tässä m on sanakirja, joka on pohjimmiltaan a joka on lähetettävä palvelimelta asiakkaalle. Tämä tapahtuu tekemällä ensin sarja sarjakuvaobjektilla käyttämällä kaatopaikkoja () ja muuttamalla sitten tavuiksi.
Kirjoitetaan nyt asiakaspuolen vastine:

Asiakkaan puolella:

tuontipistoke tuoksukurkkua a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) kun taas True: complete_info = b '' rec_msg = True kun True: mymsg = s.recv (10) jos rec_msg: print (f'Viestin pituus = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = Väärä täydellinen_info + = mymsg jos len (täydellinen_info) -a == x: tulosta ('Vastaanotettu täydellinen tieto') tulosta (täydellinen_info [a:]) m = suolakurkku.lataus (täydellinen_info [a:]) tulosta (m) rec_msg = Todellinen täydellinen_info = b '' tulosta (täydellinen_tieto) )

Ensimmäisen while-silmukka auttaa meitä seuraamaan koko viestiä (complete_info) sekä viestiä, joka vastaanotetaan (rec_msg) puskurin avulla. viesti asettamalla rec_
Sitten, kun viestiä vastaanotetaan, kaikki, mitä teen, on tulostaa jokainen sen bitti, joka vastaanotetaan kokoisena 10: n puskurissa. Tämä koko voi olla mikä tahansa henkilökohtaisesta valinnastasi riippuen.

Sitten, jos vastaanotettu viesti on yhtä suuri kuin koko viesti, tulostan vain viestin vastaanotettuina täydellisinä tiedoina, minkä jälkeen olen poistanut viestin sarjallisuuden käyttämällä latauksia ().

Yllä olevan ohjelman tulos on seuraava:

Tämä tuo meidät tämän Pythonin Socket-ohjelmointia koskevan artikkelin loppuun. Toivon, että ymmärsit kaikki käsitteet selvästi.

Varmista, että harjoittelet mahdollisimman paljon ja palauta kokemuksesi.

Onko sinulla kysymys meille? Mainitse se tämän “Socket Programming in Python” -blogin kommenttiosassa, niin otamme sinuun yhteyttä mahdollisimman pian.

Saadaksesi syvällistä tietoa Pythonista sen eri sovellusten kanssa, voit ilmoittautua livenä 24/7 -tuella ja käyttöikä.