Pythoni socket-programmeerimine - enne kui ma hakkan Pythoni socket-programmeerimisega alustama, loodan, et teil on pythoni põhitõed. Kui teate ka Djangot, oleks sellest veelgi lihtsam aru saada. Ei, pistikupesade programmeerimine pole Djangoga seotud, kuid Pythoni socketprogrammeerimise ja Django terminoloogiad on peaaegu samad, ehkki need on kaks erinevat kategooriat. Nii et kõigepealt, mis täpselt on Python Socket Programming? Programmeerimine Python Socketis pole mitte ainult pythonis, vaid ka Java ja peaaegu kõigis teistes programmeerimiskeeltes. Kuid pythoni puhul on pistikupesa programmeerimine tegelikult väga hõlpsasti arusaadav. Programmeerimine Python Socketi abil tähendab võrgu programmeerimist. See sisaldab kliendi ja Python Socketi serveripoolseid koode. Kuid see määratlus on sama hea, kui tarkvara arendamiseks kasutatakse raamatut, milles öeldakse C-programmeerimine. Ja ei, ma pole siin selleks. Olen siin selleks, et enne oma pistikupesa moodulite kirjutamist hakkaksite Pythoni pistikupesade programmeerimise põhitõdesid põhjalikumalt tundma õppima. Alustame ja vaatame, kuidas pesa töötab kas kliendi või Python Socketi serveri poolel.

Mis on Python Socket Programming?

Kui olete õppinud C-programmeerimist, oleks Pythoni pistikupesade programmeerimine Pythonis väga lihtne õppida, kuna need on peaaegu samad. Lihtsamaks muutmiseks on python-pistikupesade programmeerimine vaid kood, kuidas võrgu arvutid omavahel suhelda. Ja see ei lõpe ainult LAN-põhise võrguga, see toetab ka WAN-, MAN- ja sisevõrgupõhiseid võrke. Me kasutame pistikupesasid isegi oma igapäevases elus. Mitte aru saama? Lubage mul tuua teile lihtne näide. Kui soovite ühenduse luua saidiga Facebook.com, sisestage lihtsalt URL-i ribale sama asi. Niisiis, see äsja loodud ühendus pole ainult DNS-i kraami loodud. See kõik on konfigureeritud python socket programmeerimise kaudu. Pistikupesad otsustavad, kuidas kaks võrku omavahel suhelda saavad. Mis tahes suhtlus, mis toimub läbi võrgu, olgu selleks video, VOIP-ühendused või lihtsalt tekst; kõik läheb läbi pistikupesa. Nüüd, kui me teame, mis pistikupesad on, laseme oma pistikupesa pütonis välja töötada.

Kujutise allikas: pixabay.com

Python Socket programmeerimise tüübid

Nüüd on seal palju pistikupesasid. Kuid me ei räägi neist kõigist, kuna ma ei saa neid kõiki siin käsitleda. Võite luua UDP-pistikupesa, TCP-pistikupesa või isegi pordipesa ja neid on palju, kui jätkan. Kuid uuriksin täna lähemalt TCP- ja UDP-pistikupesi, kuna need on kõige põhitõed ja Python Socketi programmeerimisega alustamiseks võivad need olla eriti head algajad.

  • UDP-pistikupesade programmeerimine

Kasutaja Datagrammi protokoll või selle üldtuntud nimetus UDP on alternatiivne protokoll TCP-le, mis edastab pakette ühest hostist teise. Kuid erinevalt TCP-st (edastusjuhtimisprotokoll) on UDP ühendusteta protokoll ja see pole vooge orienteeritud. See tähendab, et UDP-server hõivab kogu hostist sissetulevaid pakette ainult usaldusväärse lähteühenduse tuvastamata. Selleks kasutame funktsiooni socket.socket. Pythonis luuakse järgmisel viisil lihtne UDP-pesa:

impordi pistikupesa # pistikupesa mooduli importimine pythoni raamatukogust # Nüüd peame looma AF_INET ja soki dgram socketss = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) print „Socket Creation Successful“

Jah. See selleks ja me oleme siin pythonis loonud lihtsa UDP-pesa. Pythoni pesa programmeerimine või isegi lihtsa pistikupesa loomine pole raketiteadus. Kuid suur asi seisneb UDP serveri ja kliendi kodeerimises. Kuna UDP-pistikupesad on ühendusteta, käivitatakse kommud pistikupesa saatmise ja vastuvõtmise funktsioonidega. Need funktsioonid ei nõua nende omavahelist ühendamist. Nad saavad tegelikult pakette saata ja vastu võtta mis tahes juhuslikest allikatest. UDP-server luuakse järgmiselt:

import socketport = 2924s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) s.bind ((“”, port)) print “Masina pordiga ühenduse loomine”, port

samas 1:

andmed, aadress = s.recv alates (1024)

andmete printimine

See ei pruugi tunduda palju, kuid nii see tegelikult luuakse. Siin saab kasutada suvalist sadama. Valisin just juhusliku 2924. UDP-server vajab sissetulevate ühenduste saatmiseks ja vastuvõtmiseks avatud pordi avamist. Porti ei kuulata ega ühendusi ega taotlusi vastu võetud. See toimub lihtsalt ilma autentimiseta. Proovige ülaltoodud serverit terminalis käivitada ja vaadake, kuidas see töötab.

See on lihtsalt meie loodud UDP-server. Võimaldab muuta selle natuke huvitavamaks ja ka natuke keerukamaks:

'' See on lihtne UDP socket server '' impordi socketimport sys

HOST = “” # Siin saab proovida kõiki saadaolevaid liideseid

PORT = 2924 # Mis tahes juhuslik port, mida Windowsi või Linuxi distros vaikimisi ei kasutata

# UDP-pesa kodeerimine

proovige:

s = socket.socket (pesa.AF_INET, pesa.SOCK_DGRAM)

print “Socket initsialiseeritud” '

va socket.error, msg:

print “Pistikupesa loomine ebaõnnestus. Ilmnes järgmine tõrge: ”+ str (msg (0)) + 'Message' + msg (1)

sys.exit ()

# Nüüd peame selle pistikupesa siduma ülaltoodud hosti ja pordiga

proovige:

s.bind ((HOST, PORT))

va socket.error, msg:

print “Sidumispesa nurjus. Järgmine viga katkestas köitmise: ”+ str (msg (0)) + 'Message' + msg (1)

sys.exit ()

print 'Pistikupesa sidumine lõpule viidud'

# Säilitage loodud ühendus

samas 1:

# hõivake kliendilt andmeid muutuvate andmete ja aadressi abil

d = s.recv alates (1024)

andmed = d (0)

aadress = d (1)

kui mitte andmed:

vaheaeg

vastus = 'OK …' + andmed

s.sendto (vastus, aadress)

printida 'märkussõnum (' + aadress (0) + ':' + str (aadress (1)) + ') -' + data.strip ()

s.klose ()

Käitage ülaltoodud programmi ja käivitate UDP-serveri pordil 2924. Õnnitleme, olete edukalt loonud Pythoni Socketi. Ja kindlasti pange tähele, et UDP-server saab erinevalt TCP-serverist hakkama klientide koormaga, peamine põhjus on see, et UDP-serveris pole püsivat ühenduvust, nagu TCP-serveri puhul.

Soovitatavad kursused

  • Sertifitseerimise kursus rubiini silumisel
  • PHP MySQL-i kursus
  • VB.NET programmeerimise sertifitseerimise kursus
  • Täielik ITIL sihtasutuse koolitus
  • UDP kliendi programmeerimine

Nüüd, kui oleme UDP-serveri edukalt loonud, vajame klienti, et luua sellega õige ühendus, et oleksime kursis selle toimimisega. Nii saab Pythonis korraliku UDP kliendi loomise nimel tööd teha. See klient loob ühenduse meie ülal loodud UDP serveriga:

'' Lihtsa UDP kliendi usind-pistikupesade loomine '' impordi socketimport sys

# UDP-pistikupesa loomine

proovige:

s = socket.socket (pesa.AF_INET, pesa.SOCK_DGRAM)

va socket.error:

print 'Pistikupesa loomine ebaõnnestus'

sys.exit ()

host = '127.0.0.1'; #Võite proovida kasutada ka selle IP localhost insead, mõlemad on samad.

port = 2924;

samas (1):

msg = raw_input ('Sisestage serverisse saadetav teade:')

proovige:

#Nüüd peame keelpillid seadma

s.sendto (msg, (host, port))

# Nüüd peame andmete ja aadressi abil kliendi andmed ja aadressi saama

d = s.recv alates (1024)

vastus = d (0)

aadress = d (1)

print 'Vastus serverilt on:' + vastus

va socket.error, msg:

print 'Järgmine viga ilmnes:' + str (msg (0)) + 'Message' + msg (1)

sys.exit ()

Jep. UDP-kliendi loomine Python Socketi programmeerimisel on palju lihtsam kui UDP-serveri loomine. Kuid nii see läheb. Ma ei usu, et mul oleks vaja ülaltoodud kooditükist midagi selgitada, kuna ma olen juba kõiki # nõuandeid # sildi kommentaarides maininud. Lihtsalt veenduge, et sisestatud IP-aadress ja port oleksid õiged ja tulemüür ei blokeeri ühendust, vastasel juhul põhjustab see alati rikke, ükskõik mida.

  • TCP-pistikupesa programmeerimine

Nüüd, kui oleme õppinud UDP kliendi ja serveri loomist, võime heita pilgu TCP-pistikupesade programmeerimisele. TCP-pesa loomiseks kasutame sama funktsiooni socket.socket.

impordi pesa # Moodulipesa importimine python-teekidest # looge AF_INET ja vooge socketss = socket.socket (socket.AF_INET, socket.SOCK_STREAM) print 'Socket Creation Successful'

Siin kasutatakse AF_INET Ipv4 aadressi ühendamiseks ja sokivoog on TCP-orienteeritud protokoll. See on meie loodud lihtne TCP-pesa. Nüüd loome sama asja täpsema versiooni. Me viskame siin ka erandeid, samamoodi nagu viskasime seda UDP-serverite ja -klientide loomisel, nii et kui ühenduvus ebaõnnestub, saame teada, kus programm tegelikult asub. Kõigi nende tõrgete käsitlemiseks, nagu UDP programmeerimisel, kasutatakse rakendust Socket.error.

Nüüd laseme luua ülaltoodud tõrkekäsitlusega pistikupesa ja luua ühenduse masinaga facebook.com. Seda tuleb teha järgmiselt:

impordi pesa # pistikupesa mooduliimportimissüsteemi importimine: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

va socket.error, msg:

print 'Pistikupesa loomine ebaõnnestus. Ilmnes järgmine tõrge: '+ str (msg (0)) +', veateade: '+ msg (1)

sys.exit ();

print 'Sokli loomine õnnestus'

host = 'www.facebook.com'

port = 2924

proovige:

remote_ip = socket.gethostbyname (host)

va socket.gaierror:

print 'Vale hostinimi. Väljuvad… ”

sys.exit ()

print '+ host + IP address' on '+ remote_ip

s.connect ((remote_ip, port))

printige 'Socket Connected to' + host + 'on ip' + remote_ip

Nüüd sellest piisab, kui peame lihtsalt ühenduse looma. Kuid see pole meie eesmärk. Kavatseme luua ühenduse, kus saaksime andmeid saata ja vastu võtta ka mõlemas otsas. Saame andmeid saata sendall-funktsiooni abil. Niisiis, kuidas see läheb:

impordi pesa # pistikupesa mooduliimportimissüsteemi importimine: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

va socket.error, msg:

print 'Pistikupesa loomine ebaõnnestus. Ilmnes järgmine tõrge: '+ str (msg (0)) +', veateade: '+ msg (1)

sys.exit ();

print 'Sokli loomine õnnestus'

host = 'www.facebook.com'

port = 2924

proovige:

remote_ip = socket.gethostbyname (host)

va socket.gaierror:

print 'Vale hostinimi. Väljuvad… ”

sys.exit ()

print '+ host + IP address' on '+ remote_ip

s.connect ((remote_ip, port))

printige 'Socket Connected to' + host + 'on ip' + remote_ip

#andmete edastamine sendall-funktsiooni abil

teade = “GET / HTTP / 1.1 \ r \ n \ r \ n”

proovige:

s.sendall (teade)

va socket.error:

#Saat ebaõnnestus

print 'Edastamise rike'

sys.exit ()

print 'Sõnumi olek: Saadetud'

Nüüd, kui oleme loonud eduka ühenduse ja saame ka andmeid saata, heidame pilgu sellele, kuidas saaksime andmeid üldse saada. Nii see läheb:

impordi pesa # pistikupesa mooduliimportimissüsteemi importimine: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

va socket.error, msg:

print 'Pistikupesa loomine ebaõnnestus. Ilmnes järgmine tõrge: '+ str (msg (0)) +', veateade: '+ msg (1)

sys.exit ();

print 'Sokli loomine õnnestus'

host = 'www.facebook.com'

port = 2924

proovige:

remote_ip = socket.gethostbyname (host)

va socket.gaierror:

print 'Vale hostinimi. Väljuvad… ”

sys.exit ()

print '+ host + IP address' on '+ remote_ip

s.connect ((remote_ip, port))

printige 'Socket Connected to' + host + 'on ip' + remote_ip

#andmete edastamine sendall-funktsiooni abil

teade = “GET / HTTP / 1.1 \ r \ n \ r \ n”

proovige:

s.sendall (teade)

va socket.error:

#Saat ebaõnnestus

print 'Edastamise rike'

sys.exit ()

print 'Sõnumi olek: Saadetud'

# Nüüd, andmete saamiseks kasutame selle saavutamiseks funktsiooni recv

vastus = s.recv (4096)

prindi vastus

Viimane asi on see, et peame sulgema pistikupesa, mida me saaksime teha järgmise koodi abil:

s.klose ()

Ja lõpuks köitev osa. IP-aadresside ja sadamatega pistikupesade sidumiseks saame kasutada funktsiooni sidumine.

impordi socketimport sysHOST = ”#Samuti tegime andmetele juurdepääsu saamiseks UDP protokolliPORT = 2924 # pordiga.

s = socket.socket (pesa.AF_INET, pesa.SOCK_STREAM)

print 'Pistikupesa loomine õnnestunud'

proovige:

s.bind ((HOST, PORT))

va socket.error, msg:

print 'köitmine ebaõnnestus. Pärast ilmnenud viga '+ str (msg (0)) +' teade '+ msg (1)

sys.exit ()

print 'Sokli sidumine õnnestus'

Nüüd peame serveri ühenduse saamiseks sissetulevaid ühendusi kuulama. Seda saab teha järgmise lihtsa käsuga:

s.listen (10) print 'Kuulaja käivitus'

Lõpuks peame nende ühenduste vastuvõtmiseks looma pistikupesa:

impordi socketimport sysHOST = ”PORT = 2924

s = socket.socket (pesa.AF_INET, pesa.SOCK_STREAM)

print 'Sokli loomine õnnestus'

proovige:

s.bind ((HOST, PORT))

va socket.error, msg:

print 'köitmine ebaõnnestus. Järgmine tõrge tekkis '+ str (msg (0)) +' Message '+ msg (1)

sys.exit ()

print 'Pistikupesa sidumine õnnestunud'

s.listen (10)

print 'Kuulaja alustas'

#Ühenduste aktsepteerimine

conn, addr = s.accept ()

# Ühendatud klienditeabe pakkumine

print 'Ühendus loodud' + addr (0) + ':' + str (addr (1))

Sellel on tegelikult palju enamat. Saame kirjutada ka käitlejate koode ja muud. Kuid ma arvan, et see oleks see praegu. Veenduge, et teil oleks need põhitõed õiged, pärast mida on ülejäänud osad lihtsalt tükk kooki, mida õppida.

Esimene pildi allikas: pixabay.com

Seotud artiklid:-

Siin on mõned artiklid, mis aitavad teil Python Socket Programmingu kohta üksikasjalikumat teavet saada, nii et lihtsalt minge lingi kaudu.

  1. 25 kõige hämmastavamat Pythoni intervjuu küsimust ja vastust
  2. Karjäär Pythonis
  3. Millised on Pythoni kasutamise eelised ja piirangud?
  4. Oluline erinevus Python vs Ruby jõudlus
  5. Sissejuhatus PHP-s oleva pistikupesa programmeerimisse
  6. Socketi programmeerimine Java | Pistikupesa klassi meetod

Kategooria: