Манипулация на сокет с Python

Съдържание
The контакти Те са интерфейсът, който ни позволява да комуникираме два или повече компютъра чрез мрежа. Благодарение на това можем да създаваме различни видове приложения, които ни помагат да предаваме данни по интернет и по този начин да виждаме резултати, които иначе не бихме имали в реално време.
Един от най -често срещаните начини за внедряване на сокети е чрез протокола TCPТова помага, че с поддръжката на операционната система предаването през интернет е нормално и без проблеми.
Тъй като знаем малко за основната концепция за това какво са гнездата, ще започнем с манипулиране на техните характеристики, една от тях е времето за изчакване.
Изчакайте времеThe време за изчакване Тя ни позволява да установим времето, през което сокетът може да бъде внимателен за получаване или изпращане на данни, това е много важно, тъй като ако има блокиране на приложението, докато това време чака, можем да изложим риска от забавяне на цялата система . Ето защо се нуждаем от това да можем да знаем какво е предварително определеното време за изчакване, а също и да можем да го установим сами за наше удобство.
За да постигнем това, можем да използваме няколко метода, които съществуват за тази цел в стандартната библиотека гнездо на Python.
gettimeout ()Първият метод е gettimeout () и както показва името му, той ни предлага началното време на изчакване на сокета, което предаваме като параметър.
settimeout ()Вторият метод е settimeout () и неговата функционалност е да установи изчакване за въпросния сокет, изразено в милисекунди.
Сега ще създадем малка програма, която ни позволява да приложим в действие наученото, за това първо ще създадем обект от типа на гнездото, който ще служи като наш тест, за това ще преминем семейството и типа на сокета към конструктора и с това можем да приложим методите.
За да видим промените, след като създадем нашия сокет, ще отпечатаме времето за изчакване, което трябва да е нула, защото е нов обект, след това с метода settimeout () Ще установим ново време за изчакване и накрая ще отпечатаме информацията, като по този начин потвърдим, че всичко е работило както трябва.
За да постигнем всичко това, трябва да гарантираме, че имаме Python инсталиран в нашата система, в неговата версия 2.7, и да имаме текстов редактор, за да можем да създаваме файловете с програмите, въпреки че можем да правим и упражнението на конзолата, но това е малко по -неудобно и не е постоянно, което означава, че бихме загубили работата си. Нека да разгледаме изходния код за този пример:
 #! / usr / bin / env сокет за импортиране на python def timeout_socket (): s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) print "Начален таймаут е:% s"% s.gettimeout () s. settimeout (100 ) отпечатайте "Новият таймаут е:% s"% s.gettimeout () if __name__ == '__main__': time_out_socket () 

Ще запишем това в нов файл, наречен socketTimeWait.py и ще го изпълним в конзола, резултатът трябва да е нещо подобно на следното:

The буфер Това е още едно от нещата, които трябва да вземем предвид, когато работим с гнезда, тъй като този компонент е този, който ще посочи количеството данни, които можем да предадем в момента, до повече буфер Колкото по -голям е обемът на данните, това обаче означава и по -голяма консумация на ресурси и по -дълго време на изчакване при предаването на същите. В противен случай а долния буфер Той представлява по -голяма скорост, въпреки че ограничава количеството данни, които трябва да бъдат прехвърлени, затова е умение, което трябва да усвоим.
setsockopt ()За да ни помогне да манипулираме буфера на библиотеката гнездо на Python ни предлага метода setsockopt(), което трябва да приложим към екземпляр на сокетния клас. Ако искаме да променим размера на буфера, със сигурност първо трябва да знаем първоначалния размер на буфера на гнездото, за това имаме и метода getsockopt () и се използва по почти същия начин като метода, който описахме по -горе.
Ще създадем малка програма, която да демонстрира това, което обяснихме по -рано, в кода, който ще видим за първи път създайте двойка константи които ще използваме в нашата програма и ще бъдат дефинирани до 4096 което е стойност за размера на буферите, които ще установим.
След това правим екземпляр на класа на сокета, за да поискаме веднага първоначалните размери на буфера, след което ги отпечатваме на екрана.
Накрая ще използваме метода setsockopt () За да зададете желания размер на буфера с помощта на константи, определени в началото на програмата, този метод получава три параметъра, нивото, името и накрая стойността за буфера.
Нека да видим кода, който ни помага да уточним какво сме обяснили, ще го запишем във файл, наречен size_buffer.py:
 #! / usr / bin / env сокет за импортиране на python TAM_BUFFER_SEND = 4096 TAM_BUFFER_RECEPCION = 4096 def manipulate_buffer (): sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Вземете размера на буфера на socket.sock.soc (socket.SOL_SOCKET, socket.SO_SNDBUF) печат "Размер на буфера [Преди]:% d"% Размер на буфера sock.setsockopt (socket.SOL_TCP, socket.TCP_NODELAY, 1) sock.setsockopt (socket.SOL_SOCKET, socket.SO_SND setsockopt (socket.SOL_SOCKET, socket.SO_RCVBUF, SIZE_BUFFER_RECEPCION) buffersize = sock.getsockopt (socket.SOL_SOCKET, socket.SO_SNDBUF) печат "Размер на буфера [След]:% d =% манипулирай_буфер = '__ () 

След като напишем нашата програма, ще продължим да я изпълняваме в конзолата и ще видим, че получаваме стойностите на буфера преди и след промяна на неговия размер.

Както при всички видове програми, когато работим с сокети, не сме освободени от някои грешки, проблемът, който трябва да избегнем, е, че тези грешки ни изненадват, тъй като ако това се случи, нашето приложение може да функционира непредсказуемо.
Ето защо трябва да се научим да се справяме с грешки, по този начин, ако възникне неочаквана ситуация, нашата програма не умира, но ни уведомява, че нещо се е случило, с това ще избегнем повреда на данни или подобни ситуации, които засягат стабилността на нашата Програма.
Как да се справим?Постигаме това с помощта на блокове пробвай - с изключение които ни позволяват да оценяваме ситуации, които обикновено включват данни извън нашия контрол и с това можем да действаме в сценарии според отговорите, които получаваме. Ако попаднем в раздела с изключение от блока можем да използваме свойството за грешка на нашия екземпляр и с него да отпечатаме какво се е случило и по този начин да знаем каква е грешката.
В следващата програма ще тестваме това, което сме дефинирали по време на обяснението. На първо място ще създадем блок, който да ни контролира, ако създаването на сокет е имало грешка или не, с това можем да осигурим добър старт на нашия код.
След това ще оценим връзката на нашето приложение с отдалечен хост през определен порт и с обработка на грешки можем да дефинираме персонализирано съобщение. Накрая правим извикване на нашата функция и с нея ще изпълним описаните действия.
Нека видим следния код, който трябва да съхраним във файл, наречен errors_socket.py и след това ще го стартираме в конзолата:
 #! / usr / bin / env python импортиращ сокет за импортиране на sys хост = 'http: //python.orgt' port = '06' def error_handling (): try: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) с изключение на socket.error, e: print "Възникна грешка при създаването на гнездото:% s"% e sys.exit (1) try: s.connect ((хост, порт)) с изключение на socket.gaierror, e: print "Грешка в адрес за връзка:% s "% e sys.exit (1) с изключение на socket.error, e: print" Грешка при връзката:% s "% e sys.exit (1) if __name__ == '__main__': error_handling () 

Тук виждаме, че сме използвали библиотеката sys за да използваме метода изход () и затворете програмата, след като възникне грешка. Също така отбелязваме, че хостът е неправилен, това е така, че да можем да принудим грешката и по този начин да видим съобщението на екрана. Накрая отбелязваме, че използваме променливата e за улавяне на грешката на гнездото, с което можем да получим реалните подробности за случилото се.
ПомняТук трябва да бъдем особено внимателни с вдлъбнатина от кода запомнете това Python Като не използват скоби, точка и запетая за определяне на затваряне на блокове зависят изключително от интервалите или разделите, които използваме, така че ако не го направим правилно, ще видим синтаксични грешки.
Много е важно да прочетем документацията на Библиотека на сокет на Python за да можете да намерите повече и по -добри начини да се възползвате от вашите ресурси.
С това завършихме този урок, разбрахме как Python има много лесни за разбиране инструменти, които ни дават достъп до света на контактиС това можем да започнем да програмираме приложения, които използват мрежи за извършване на обработка в реално време, като например получаване на информация от други машини в мрежата или дори от Интернет.Хареса ли ви и помогнахте на този урок?Можете да възнаградите автора, като натиснете този бутон, за да му дадете положителна точка

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave