Cuprins
prize Sunt interfața care ne permite să comunicăm două sau mai multe computere printr-o rețea. Datorită acestui fapt, putem crea diferite tipuri de aplicații care ne ajută să transmitem date prin Internet și astfel să vedem rezultate pe care altfel nu le-am avea în timp real.Una dintre cele mai comune modalități de implementare a socket-urilor este prin protocol TCPAcest lucru ajută la faptul că, cu sprijinul sistemului de operare, transmisia prin Internet este normală și fără probleme.
Deoarece știm puțin despre conceptul de bază despre ce sunt soclurile, vom începe prin a le manipula caracteristicile, una dintre ele este timpul de așteptare.
Timp de așteptare timp de așteptare Ne permite să stabilim cantitatea de timp în care socket-ul poate fi atent pentru a primi sau trimite date, acest lucru este foarte important, deoarece dacă există un blocaj al aplicației în timp ce acest timp este în așteptare, putem suferi riscul de a încetini un întreg sistem . De aceea, avem nevoie de posibilitatea de a cunoaște care este timpul de așteptare prestabilit și, de asemenea, de a ne putea stabili singuri pentru confortul nostru.
Pentru a realiza acest lucru, putem folosi câteva metode care există în acest scop în biblioteca standard priză de Piton.
gettimeout ()Prima metodă este gettimeout () și așa cum indică și numele, ne oferă timpul de așteptare inițial al soclului pe care îl trecem ca parametru.
setimeout ()A doua metodă este setimeout () iar funcționalitatea sa este de a stabili un timeout pentru socket-ul în cauză exprimat în milisecunde.
Acum vom crea un mic program care ne permite să punem în acțiune ceea ce am învățat, pentru aceasta vom crea mai întâi un obiect de tip socket care va servi drept subiectul nostru de testare, pentru aceasta vom trece de familie și tipul de socket la constructor și cu aceasta putem aplica metodele.
Pentru a vedea modificările odată ce ne-am creat socket-ul, vom imprima timpul său de așteptare care trebuie să fie nul deoarece este un obiect nou, apoi cu metoda setimeout () Vom stabili un nou timp de așteptare și, în cele din urmă, vom imprima informațiile, confirmând astfel că totul a funcționat așa cum ar trebui.
Pentru a realiza toate acestea, trebuie să ne asigurăm că avem Piton instalat în sistemul nostru, în versiunea sa 2.7, și au un editor de text pentru a putea crea fișierele cu programele, deși putem face exercițiul și pe consolă, totuși este puțin mai incomod și nu este persistent, ceea ce înseamnă că ne-am pierde munca. Să ne uităm la codul sursă pentru acest exemplu:
#! / usr / bin / env python import socket def timeout_socket (): s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) print "Timeout inițial este:% s"% s.gettimeout () s. settimeout (100 ) print "Noul timeout este:% s"% s.gettimeout () dacă __name__ == '__main__': time_out_socket ()
Vom salva acest lucru într-un fișier nou numit socketTimeWait.py și îl vom executa în consolă, rezultatul ar trebui să fie ceva similar cu următorul:
tampon Este un alt lucru pe care trebuie să îl luăm în considerare atunci când lucrăm cu sockets, deoarece această componentă este cea care va indica cantitatea de date pe care o putem transmite în acest moment, pentru a mai tampon Cu cât este mai mare cantitatea de date, totuși acest lucru înseamnă, de asemenea, un consum mai mare de resurse și un timp de așteptare mai mare în transmiterea acestora. Altfel a tampon inferior Reprezintă o viteză mai mare, deși limitează cantitatea de date de transferat, de aceea este o abilitate pe care trebuie să o stăpânim.
setsockopt ()Pentru a ne ajuta să manipulăm tamponul bibliotecii priză de Piton ne oferă metoda setsockopt(), pe care trebuie să îl aplicăm unei instanțe din clasa socket. Dacă vrem să schimbăm dimensiunea bufferului, cu siguranță trebuie să cunoaștem mai întâi dimensiunea originală a bufferului socket, pentru aceasta avem și metoda getsockopt () și este utilizat în același mod ca și metoda pe care am descris-o mai sus.
Vom crea un mic program pentru a demonstra ceea ce am explicat anterior, în codul la care vom vedea că mergem mai întâi creați o pereche de constante pe care îl vom folosi în programul nostru și vom fi definiți 4096 care este o valoare pentru dimensiunea bufferelor pe care le vom stabili.
Apoi facem o instanță a clasei de socket, pentru a cere imediat dimensiunile inițiale ale bufferului, apoi le imprimăm pe ecran.
În cele din urmă vom folosi metoda setsockopt () Pentru a seta dimensiunea dorită a bufferului utilizând constantele definite la începutul programului, această metodă primește trei parametri, nivelul, numele și, în final, valoarea bufferului.
Să vedem codul care ne ajută să specificăm ce am explicat, vom salva într-un fișier numit size_buffer.py:
#! / usr / bin / env python import socket TAM_BUFFER_SEND = 4096 TAM_BUFFER_RECEPCION = 4096 def manipulate_buffer (): sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Obțineți dimensiunea bufferului de expediere socket sizeBuffer (socket.SOL_SOCKET, socket.SO_SNDBUF) print "Buffer Size [Before]:% d"% Buffer size sock.setsockopt (socket.SOL_TCP, socket.TCP_NODELAY, 1) sock.setsockopt (socket.SOL_SOCKET, socket.SO_SNDBUFFER_ setsockopt (socket.SOL_SOCKET, socket.SO_RCVBUF, SIZE_BUFFER_RECEPCION) buffersize = sock.getsockopt (socket.SOL_SOCKET, socket.SO_SNDBUF) print "Buffer size [After]:% d"% manipulate_buffer_size = '___buffer_size =' = '__ ()
Odată ce ne-am scris programul, vom continua să îl executăm în consolă și vom vedea că obținem valorile bufferului înainte și după modificarea dimensiunii acestuia.
La fel ca în cazul tuturor tipurilor de programe, atunci când lucrăm cu socketuri nu suntem scutiți să întâmpinăm unele erori, problema pe care trebuie să o evităm este că aceste erori ne iau prin surprindere, deoarece dacă o fac, aplicația noastră poate funcționa imprevizibil.
De aceea trebuie să învățăm să gestionăm erorile, în acest fel, dacă apare o situație neașteptată, programul nostru nu moare, dar ne anunță că s-a întâmplat ceva, cu aceasta vom evita corupția datelor sau situații similare care afectează stabilitatea programului nostru.
Cum să mă descurc?Obținem acest lucru folosind blocuri încercați - cu excepția care ne permit să evaluăm situații, în general care implică date care nu ne controlează și cu aceasta putem acționa în scenarii în funcție de răspunsurile pe care le obținem. Dacă intrăm în secțiune cu exceptia din bloc putem folosi proprietatea de eroare a instanței noastre și cu ea să imprimăm ce s-a întâmplat și astfel să știm care a fost eșecul.
În următorul program vom testa ceea ce am definit în timpul explicației. În primul rând, vom crea un bloc care ne controlează dacă crearea socketului a avut sau nu o eroare, cu aceasta putem asigura un început bun al codului nostru.
Apoi, vom evalua conexiunea aplicației noastre la o gazdă la distanță printr-un anumit port și cu gestionarea erorilor putem defini un mesaj personalizat. În cele din urmă, facem apelul la funcția noastră și cu aceasta vom executa acțiunile descrise.
Să vedem următorul cod pe care trebuie să-l stocăm într-un fișier numit errors_socket.py și apoi îl vom rula în consolă:
#! / usr / bin / env python import sys import socket host = 'http: //python.orgt' port = '06' def error_handling (): try: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) cu excepția socket.error, e: print "A apărut o eroare la crearea socket-ului:% s"% e sys.exit (1) try: s.connect ((gazdă, port)) cu excepția socket.gaierror, e: print "Eroare în adresa conexiunii:% s "% e sys.exit (1) cu excepția socket.error, e: print" Eroare conexiune:% s "% e sys.exit (1) dacă __name__ == '__main__': error_handling ()
Aici vedem că am folosit biblioteca sys pentru a folosi metoda Ieșire () și închideți programul după ce apare o eroare. De asemenea, observăm că gazda este incorectă, astfel încât să putem forța eroarea și astfel să vedem mesajul pe ecran. În cele din urmă, observăm că folosim variabila e pentru a captura eroarea socket, cu aceasta putem obține detaliile reale ale celor întâmplate.
Tine minteAici trebuie să fim deosebit de atenți cu indentare din cod amintiți-vă că Piton Dacă nu utilizați paranteze, punctele și virgulele pentru a defini închiderile blocurilor depind exclusiv de spațiile sau filele pe care le folosim, așa că, dacă nu o facem corect, vom vedea erori de sintaxă.
Este foarte important să citim documentația Librărie socket Python astfel încât să puteți găsi mai multe și mai bune modalități de a profita de resursele dvs.
Cu aceasta terminăm acest tutorial, ne-am dat seama cum Piton are instrumente foarte ușor de înțeles care ne oferă acces la lumea prizeCu aceasta putem începe să programăm aplicații care utilizează rețele pentru a efectua procesări în timp real, cum ar fi obținerea de informații de la alte mașini din rețea sau chiar de pe Internet.V-a plăcut și ați ajutat acest tutorial?Puteți recompensa autorul apăsând acest buton pentru a-i oferi un punct pozitiv