Какво е програмиране на сокети в Python и как да го овладеете?



Научете какво е програмиране на сокети в Python заедно с комуникация клиент-сървър заедно с прехвърляне на python обекти с помощта на туршия и сокети.

Интернет безспорно се е превърнал в „Душата на съществуването“ и неговата дейност се характеризира с „Връзки“ или „Мрежи“. Тези мрежи са възможни с помощта на една от най-важните основи на Гнезда. Тази статия обхваща всички области, занимаващи се с програмиране на сокети в Python. Сокетите ви помагат да осъществите тези връзки, докато , несъмнено го прави лесно.

Нека да разгледаме набързо всички теми, обхванати в тази статия:





Защо да използваме Sockets?
Какво представляват сокетите в Python?
Как да постигна програмиране на сокети в Python
Какво е сървър?
Какво е клиент?
Ехо клиент-сървър
Множество комуникации
Прехвърляне на Python обекти

c ++ сортиране на числа във възходящ ред



Защо да използваме Sockets?

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

Преди да се потопите по-дълбоко в тази комуникация, нека първо разберем какви точно са тези гнезда.

Какво представляват гнездата?

Най-общо казано, гнездата са вътрешни крайни точки, изградени за изпращане и получаване на данни. Една мрежа ще има два цокъла, по един за всяко комуникиращо устройство или програма. Тези гнезда са комбинация от IP адрес и порт. Едно устройство може да има ‘n’ брой сокети въз основа на номера на порта, който се използва. Налични са различни портове за различни видове протоколи. Разгледайте следното изображение за повече информация за някои от общите номера на портове и свързаните с тях протоколи:




общи портове-SocketProgramminginPython-Edureka

След като вече сте наясно с концепцията за сокети, нека сега разгледаме модула Socket на Python:

Как да постигнем програмиране на сокети в Python:

За да постигнете Socket Programming в Python, ще трябва да импортирате гнездо модул или . Този модул се състои от вградени методи, които са необходими за създаване на сокети и им помагат да се свързват помежду си.

Някои от важните методи са следните:

МетодиОписание

socket.socket ()

използва се за създаване на сокети (изисква се както на сървъра, така и на клиентските краища за създаване на сокети)

socket.accept ()

използва се за приемане на връзка. Той връща двойка стойности (conn, адрес), където conn е нов обект на сокет за изпращане или получаване на данни, а адресът е адресът на сокета, присъстващ в другия край на връзката

socket.bind ()

използва се за свързване с адреса, който е посочен като параметър

socket.close ()

използва се за маркиране на гнездото като затворено

socket.connect ()

използва се за свързване с отдалечен адрес, посочен като параметър

socket.listen ()

позволява на сървъра да приема връзки

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

Какво е сървър?

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

Сървърите обикновено използват методи като 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) while True: clt, adr = s.accept () print (f'Connection to {adr} установен ') #f низ е буквален низ с префикс f, който # съдържа питонови изрази в скоби clt .send (bytes ('Socket Programming in Python', 'utf-8')) # за изпращане на информация до clientsocket

Както можете да видите, първата необходимост за създаване на сокет е да импортирате сокет модула. След това методът socket.socket () се използва за създаване на сокет от страна на сървъра.

ЗАБЕЛЕЖКА:

AF_INET се отнася до Адрес от Интернет и той изисква двойка (хост, порт), където хостът може да бъде URL адрес на определен уебсайт или негов адрес, а номерът на порта е цяло число. SOCK_STREAM се използва за създаване на TCP протоколи.

Методът bind () приема два параметъра като кортеж (хост, порт). По-добре е обаче да използвате 4-цифрени номера на портове, тъй като долните обикновено са заети. Методът Listen () позволява на сървъра да приема връзки. Тук 5 е опашката за множество връзки, които се появяват едновременно. Минималната стойност, която може да бъде посочена тук, е 0 (Ако дадете по-малка стойност, тя се променя на 0). В случай че не е посочен параметър, той приема подходящ по подразбиране.

The позволява приемане на връзки завинаги. „Clt“ и „adr“ са клиентски обект и адрес. Отпечатването просто отпечатва адреса и номера на порта на клиентския сокет. И накрая, clt.send се използва за изпращане на данните в байтове.

Сега, когато нашият сървър е готов, нека преминем към клиента.

Какво е клиент?

Клиентът е или компютър или софтуер, който получава информация или услуги от сървъра. В модул клиент-сървър клиентските заявки за услуги от сървъри. Най-добрият пример е уеб браузър като Google Chrome, Firefox и др. Тези уеб браузъри изискват уеб сървъри за необходимите уеб страници и услуги според указанията на потребителя. Други примери включват онлайн игри, онлайн чатове и т.н.

Сега нека да разгледаме как да кодираме програмата от страна на клиента :

ПРИМЕР:

импортиране на сокет s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

Първата стъпка е да импортирате сокет модула и след това да създадете сокет, точно както сте направили при създаването на сървър. След това, за да създадете връзка между клиент-сървъра, ще трябва да използвате метода connect (), като посочите (хост, порт).


ЗАБЕЛЕЖКА: gethostname се използва, когато клиентът и сървърът са включени на един и същ компютър. (LAN - localip / WAN - publicip)

Тук клиентът иска да получи някаква информация от сървъра и за това трябва да използвате метода recv () и информацията се съхранява в друга променлива msg. Само имайте предвид, че информацията, която се предава, ще бъде в байтове и клиентът в горната програма може да получи до 1024 байта (размер на буфера) с едно прехвърляне. Тя може да бъде посочена за всяка сума в зависимост от количеството информация, която се прехвърля.

И накрая, съобщението, което се прехвърля, трябва да бъде декодирано и отпечатано.

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

Ехо клиент-сървър:

За да изпълните тези програми, отворете командния ред, влезте в папката, в която сте създали вашата клиентска и сървърна програма и след това въведете:

py server.py (тук server.py е името на файла на сървъра, можете също да използвате py -3.7 server.py)

След като това бъде направено, сървърът започва да работи. За да изпълните клиента, отворете друг cmd прозорец и напишете:

py client.py (тук client.py е името на файла на клиента)

ИЗХОД (СЪРВЪР):

(КЛИЕНТ)

Нека опитаме същата програма, като намалим размера на буфера до 7 и да видим какъв изход получаваме:

ИЗХОД:

Както можете да видите, връзката се прекъсва след прехвърляне на 7 байта. Но това е проблем, защото не сте получили пълната информация и връзката е затворена. Нека да продължим да решаваме този проблем.

Множество комуникации:

За да продължи връзката, докато клиентът не получи пълната информация, можете да използвате цикъла while:

ПРИМЕР:

импортиране на сокет s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)), докато True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

След като направите това, цялото съобщение ще бъде получено в 7 байта на трансфер.

Но този път, както виждате, връзката не се прекратява и никога не се знае кога ще се случи. И за да добавите към това, какво, ако всъщност не знаете колко голямо е съобщението или информацията, които клиентът ще получи от сървъра. В такива случаи всъщност можете да използвате следния бит код от страна на клиента:

ПРИМЕР:

complete_info = 'докато True: msg = s.recv (7) ако len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

От страна на сървъра използвайте метода close (), както следва:

clt.close ()

Резултатът от това ще бъде както е показано на изображението по-долу:

ИЗХОД:



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

Прехвърляне на Python обекти:

До тук току-що сте стигнали до умението да прехвърляте низове. Но, Програмиране на гнезда в Python също ви позволява да прехвърляте и Python обекти. Тези обекти могат да бъдат нещо като набори, кортежи, речници и др. За да постигнете това, ще трябва да импортирате модула за туршии на Python.

Модул за туршия на Python:

Модулът на Python pickle се появява, когато всъщност сериализирате или десериализирате обекти в python. Нека да разгледаме един малък пример,

ПРИМЕР:

импортиране на туршия mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

ИЗХОД: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Както можете да видите, в горната програма ‘mylist’ е сериализиран с помощта на функцията dumps () на модула на туршия. Също така отбележете, че изходът започва с „b“, което означава, че се преобразува в байтове. При програмирането на сокети можете да приложите този модул за прехвърляне python обекти между клиенти и сървъри.

Как да използвам модула на туршия за прехвърляне на обектни структури на python?

Когато използвате туршия заедно с гнездата, можете абсолютно да прехвърляте всичко чрез мрежата. Нека запишем сървърната и клиентската страна, за да прехвърлим списък от сървъра към клиента:

какво е сесията в java

От страна на сървъра:

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) while True: clt, adr = s.accept () print (f'Connection to {adr} установен ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) # съобщението, което искаме да отпечатаме по-късно mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Тук m е речник, който е основно a което трябва да бъде изпратено от сървъра до клиента. Това се прави, като първо сериализираме обекта с помощта на dumps () и след това го преобразуваме в байтове.
Сега нека запишем копие от страна на клиента:

От страна на клиента:

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 ('Получава пълната информация') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True true_info = b '' print (complete_info )

Първият цикъл while ще ни помогне да следим цялото съобщение (complete_info), както и съобщението, което се получава (rec_msg) с помощта на буфера. съобщението, като зададете rec_
След това, докато съобщението се получава, всичко, което правя, е да отпечатам всеки бит от него, получавайки го в буфер с размер 10. Този размер може да бъде всеки в зависимост от вашия личен избор.

След това, ако полученото съобщение е равно на пълното съобщение, аз просто отпечатвам съобщението като получена пълна информация, след което съм десериализирал съобщението, използвайки load ().

Резултатът от горната програма е както следва:

Това ни води до края на тази статия за Socket Programming в Python. Надявам се, че сте разбрали ясно всички понятия.

Уверете се, че практикувате възможно най-много и връщате опита си.

Имате въпрос към нас? Моля, споменете го в раздела за коментари в този блог „Програмиране на сокети в Python“ и ние ще се свържем с вас възможно най-скоро.

За да получите задълбочени познания за Python заедно с различните му приложения, можете да се регистрирате за живо с 24/7 поддръжка и доживотен достъп.