Kas ir Socket programmēšana Python un kā to apgūt?

Uzziniet, kas ir Socket Programming Python, kā arī klienta-servera komunikācijas kopā ar python objektu pārsūtīšanu, izmantojot marinētu gāzi un ligzdas.

Internets nenoliedzami ir kļuvis par ‘Esības dvēseli’, un tā darbību raksturo ‘Savienojumi’ vai ‘Tīkli’. Šie tīkli ir iespējami, izmantojot vienu no vissvarīgākajiem Kontaktligzdas. Šis raksts aptver visas jomas, kas nodarbojas ar Socket programmēšanu Python. Kontaktligzdas palīdz jums izveidot šos savienojumus, kamēr , neapšaubāmi, padara to viegli.

Apskatīsim visas šajā rakstā aplūkotās tēmas:





Kāpēc izmantot Sockets?
Kas ir Socket Python?
Kā sasniegt Socket programmēšanu Python
Kas ir serveris?
Kas ir klients?
Echo klients-serveris
Vairāki sakari
Python objektu pārsūtīšana



Kāpēc izmantot Sockets?

Kontaktligzdas ir tīkla pamats. Tie nodrošina informācijas pārsūtīšanu starp divām dažādām programmām vai ierīcēm. Piemēram, atverot pārlūkprogrammu, jūs kā klients izveidojat savienojumu ar serveri informācijas pārsūtīšanai.

Pirms ienirt dziļāk šajā saziņā, vispirms izdomāsim, kas tieši ir šīs kontaktligzdas.

Kas ir kontaktligzdas?

Parasti ligzdas ir iekšējie galapunkti, kas izveidoti datu sūtīšanai un saņemšanai. Vienā tīklā būs divas ligzdas, pa vienai katrai saziņas ierīcei vai programmai. Šīs ligzdas ir IP adreses un porta kombinācija. Vienai ierīcei var būt “n” ligzdu skaits, pamatojoties uz izmantotā porta numuru. Dažāda veida protokoliem ir pieejamas dažādas ostas. Apskatiet šo attēlu, lai uzzinātu vairāk par dažiem parastajiem porta numuriem un saistītajiem protokoliem:




common ports-SocketProgramminginPython-Edureka

Tagad, kad jums ir skaidrs ligzdu jēdziens, tagad apskatīsim Python moduli Socket:

Kā sasniegt Socket programmēšanu Python:

Lai sasniegtu Socket Programming Python, jums būs jāimportē kontaktligzda modulis vai . Šis modulis sastāv no iebūvētām metodēm, kas nepieciešamas, lai izveidotu kontaktligzdas un palīdzētu tām saistīties savā starpā.

Dažas svarīgas metodes ir šādas:

MetodesApraksts

socket.socket ()

izmanto, lai izveidotu kontaktligzdas (nepieciešamas gan serverī, gan klienta galos, lai izveidotu ligzdas)

socket.accept ()

izmanto, lai pieņemtu savienojumu. Tas atgriež vērtību pāri (savienojums, adrese), kur savienojums ir jauns kontaktligzdas objekts datu nosūtīšanai vai saņemšanai, un adrese ir kontaktligzdas adrese, kas atrodas savienojuma otrajā galā.

socket.bind ()

izmanto, lai piesaistītos adresei, kas norādīta kā parametrs

socket.close ()

izmanto, lai atzīmētu kontaktligzdu kā slēgtu

socket.connect ()

izmanto, lai izveidotu savienojumu ar attālo adresi, kas norādīta kā parametrs

socket.listen ()

ļauj serverim pieņemt savienojumus

Tagad, kad esat sapratis ligzdas moduļa nozīmi, turpināsim redzēt, kā tas var kalpot, lai izveidotu serverus un klientus Socket programmēšanai .

Kas ir serveris?

Serveris ir vai nu programma, dators vai ierīce, kas veltīta tīkla resursu pārvaldībai. Serveri var būt vienā ierīcē vai datorā vai lokāli savienoti ar citām ierīcēm un datoriem vai pat attālināti. Ir dažādi serveru veidi, piemēram, datu bāzes serveri, tīkla serveri, drukas serveri utt.

kā mainīt skaitli

Serveri parasti izmanto tādas metodes kā socket.socket (), socket.bind (), socket.listen () utt., Lai izveidotu savienojumu un saistītos ar klientiem. Tagad uzrakstīsim programmu, lai izveidotu serveri. Apsveriet šādu piemēru:

PIEMĒRS:

importēt ligzdu s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # porta numurs var būt jebkas starp 0-65535 (mēs parasti norādām nepievienotos portus, > 1023) s.listen (5), bet True: clt, adr = s.accept () print (f'Savienojums ar {adr} izveidots ') #f virkne ir burtiska virkne, kas pievienota f, kas # satur python izteicienus iekavās clt .send (baiti ('Socket Programming in Python', 'utf-8')) # lai nosūtītu informāciju klientam

Kā redzat, pirmā nepieciešamība izveidot ligzdu ir ligzdas moduļa importēšana. Pēc tam servera puses ligzdas izveidošanai tiek izmantota metode socket.socket ().

PIEZĪME:

AF_INET attiecas uz adresi no interneta, un tam ir nepieciešams pāris (resursdators, ports), kur resursdators var būt vai nu kādas konkrētas vietnes URL, vai arī tā adrese, un porta numurs ir vesels skaitlis. SOCK_STREAM tiek izmantots, lai izveidotu TCP protokolus.

Metode bind () pieņem divus parametrus kā kopu (resursdators, ports). Tomēr labāk ir izmantot četrciparu porta numurus, jo zemākie parasti tiek aizņemti. Klausīšanās () metode ļauj serverim pieņemt savienojumus. Šeit 5 ir rinda uz vairākiem savienojumiem, kas rodas vienlaikus. Minimālā vērtība, ko šeit var norādīt, ir 0 (ja norādāt mazāku vērtību, tā tiek mainīta uz 0). Ja neviens parametrs nav norādīts, tam ir nepieciešams noklusējums.

The ļauj pieņemt savienojumus uz visiem laikiem. ‘Clt’ un ‘adr’ ir klienta objekts un adrese. Drukātajā paziņojumā vienkārši tiek izdrukāta klienta kontaktligzdas adrese un porta numurs. Visbeidzot, clt.send tiek izmantots datu nosūtīšanai baitos.

Tagad, kad mūsu serveris ir iestatīts, dodieties uz klientu.

Kas ir klients?

Klients ir vai nu dators, vai programmatūra, kas saņem informāciju vai pakalpojumus no servera. Klienta-servera modulī klienti pieprasa pakalpojumus no serveriem. Labākais piemērs ir tīmekļa pārlūkprogramma, piemēram, Google Chrome, Firefox utt. Šīs tīmekļa pārlūkprogrammas pieprasa tīmekļa serverus nepieciešamajām tīmekļa lapām un pakalpojumiem, kā norādījis lietotājs. Citi piemēri ietver tiešsaistes spēles, tiešsaistes tērzēšanas sarunas utt.

Tagad apskatīsim, kā kodēt klienta programmas programmu :

PIEMĒRS:

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

Pirmais solis ir ligzdas moduļa importēšana un pēc tam izveidojiet ligzdu tāpat kā jūs, izveidojot serveri. Pēc tam, lai izveidotu savienojumu starp klientu-serveri, jums būs jāizmanto connect () metode, norādot (resursdators, ports).

kā instalēt php uz Windows


PIEZĪME: gethostname tiek izmantots, ja klients un serveris ir ieslēgti vienā datorā. (LAN - lokālais / WAN - publiskais)

Šeit klients vēlas saņemt daļu informācijas no servera, un tam jums jāizmanto metode recv (), un informācija tiek saglabāta citā mainīgajā msg. Vienkārši paturiet prātā, ka informācija, kas tiek nodota, būs baiti un iepriekšminētās programmas klients vienā pārsūtījumā var saņemt līdz 1024 baitiem (bufera lielums). To var norādīt jebkurai summai atkarībā no pārsūtāmās informācijas daudzuma.

Visbeidzot, pārsūtāmais ziņojums ir jāšifrē un jāizdrukā.

Tagad, kad esat informēts par to, kā izveidot klienta-servera programmas, turpināsim redzēt, kā tās ir jāizpilda.

Echo klients-serveris:

Lai izpildītu šīs programmas, atveriet komandu uzvedni, nokļūstiet mapē, kurā esat izveidojis klientu un servera programmu, un pēc tam ierakstiet:

py server.py (šeit, server.py ir servera faila nosaukums, varat izmantot arī py -3,7 server.py)

Kad tas ir izdarīts, serveris sāk darboties. Lai izpildītu klientu, atveriet citu cmd logu un ierakstiet:

py klient.py (šeit klient.py ir klienta faila nosaukums)

IZVADE (SERVERS):

(KLIENTS)

Izmēģināsim to pašu programmu, samazinot bufera lielumu līdz 7 un redzēsim, kādu rezultātu iegūstam:

REZULTĀTS:

konvertēt objektu uz masīva php

Kā redzat, savienojums tiek pārtraukts pēc 7 baitu pārsūtīšanas. Bet tas ir jautājums, jo neesat saņēmis pilnīgu informāciju un savienojums ir slēgts. Turpināsim atrisināt šo jautājumu.

Vairāki sakari:

Lai savienojums varētu turpināties, kamēr klients saņems pilnīgu informāciju, varat izmantot while ciklu:

PIEMĒRS:

importēt ligzdu s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)), bet True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Kad tas būs izdarīts, viss ziņojums tiks saņemts 7 baitos par pārsūtīšanu.

Bet šoreiz, kā redzat, savienojums netiek pārtraukts, un nekad nevar zināt, kad tas notiks. Un, lai to papildinātu, kā rīkoties, ja jūs patiešām nezināt, cik liels ir ziņojums vai informācija, ko klients saņems no servera. Šādos gadījumos klienta pusē faktiski varat izmantot šādu koda bitu:

PIEMĒRS:

complete_info = '', bet True: msg = s.recv (7), ja len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

Servera pusē izmantojiet metodi close () šādi:

clt.close ()

Rezultāts būs tāds, kā parādīts zemāk esošajā attēlā:

REZULTĀTS:



Viss iepriekš minētais koda bloks ir tas, ka tiek pārbaudīta informācijas lielums un drukāta tā divu baitu buferī vienlaikus, pēc savienojuma pabeigšanas tiek slēgts savienojums.

Python objektu pārsūtīšana:

Līdz šim jūs tikko esat ieguvis stīgu pārsūtīšanas prasmi. Bet, Socket programmēšana Python ļauj arī pārsūtīt Python objektus. Šie objekti var būt jebkas, piemēram, kopas, kopas, vārdnīcas utt. Lai to panāktu, jums būs jāimportē Python sālījumu modulis.

Python marinādes modulis:

Python marinēšanas modulis nonāk attēlā, kad jūs faktiski sērijveida vai de-serializējat objektus pitonā. Apskatīsim nelielu piemēru,

PIEMĒRS:

importēt marinētu gurķu sarakstu = [1,2, 'abc'] mymsg = marinēti gurķi. mylist) drukāt (mymsg)

REZULTĀTS: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ”

Kā redzat, iepriekšminētajā programmā ‘mylist’ tiek sērijveidots, izmantojot marinādes moduļa funkciju dumps (). Ievērojiet arī to, ka izvade sākas ar “b”, tas nozīmē, ka tā tiek konvertēta baitos. Ligzdu programmēšanā varat ieviest šo moduli pārsūtīšanai pitona objekti starp klientiem un serveriem.

Kā izmantot kodināšanas moduli, lai pārsūtītu pitona objektu struktūras?

Izmantojot marinētu gurķi kopā ar kontaktligzdām, jūs varat pilnīgi visu pārsūtīt pa tīklu. Pierakstīsim servera un klienta puses kolēģus, lai pārsūtītu sarakstu no servera uz klientu:

Servera puse:

importēt kontaktligzdu importēt marinētu gurķi a = 10 s = ligzda.socket (ligzda.AF_INET, ligzda.SOCK_STREAM) s.bind ((ligzdas.gethostname (), 2133)) #binding dupleks s.klausīties (5), bet True: clt, adr = s.accept () print (f'Savienojums ar {adr} izveidots ') m = {1:' Klients ', 2:' Serveris '} mymsg = pickle.dumps (m) # ziņa, kuru vēlamies izdrukāt vēlāk mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt. sūtīt (mymsg)

Šeit m ir vārdnīca, kas būtībā ir a kas jānosūta no servera klientam. Tas tiek darīts, vispirms sērijveidojot objektu, izmantojot izgāztuves (), un pēc tam pārveidojot to baitos.
Tagad pierakstīsim klienta puses kolēģi:

Klienta puse:

importēt ligzdu importēt marinētu gurķi a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)), bet True: complete_info = b '' rec_msg = True, bet True: mymsg = s.recv (10), ja rec_msg: print (f'Ziņas garums = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Saņemta pilnīga informācija') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Pirmais while cikls palīdzēs mums izsekot pilnam ziņojumam (complete_info), kā arī ziņojumam, kas tiek saņemts (rec_msg), izmantojot buferi. ziņojumu, iestatot rek_
Tad, kamēr tiek saņemts ziņojums, viss, ko es daru, ir drukāt katru tā daļu, saņemot buferī ar lielumu 10. Šis izmērs var būt jebkas, atkarībā no jūsu personīgās izvēles.

Tad, ja saņemtais ziņojums ir vienāds ar visu ziņojumu, es tikai drukāju ziņojumu kā saņemtu pilnīgu informāciju, pēc kuras es esmu de-serializējis ziņojumu, izmantojot slodzes ().

Iepriekšējās programmas rezultāts ir šāds:

Tādējādi mēs nonākam līdz šī raksta beigām par Socket Programming Python. Es ceru, ka jūs skaidri sapratāt visus jēdzienus.

Pārliecinieties, ka pēc iespējas vairāk praktizējat un atgriezieties pie pieredzes.

Vai mums ir jautājums? Lūdzu, pieminējiet to šī emuāra “Socket Programming in Python” komentāru sadaļā, un mēs sazināsimies ar jums pēc iespējas ātrāk.

Lai iegūtu padziļinātas zināšanas par Python kopā ar dažādām lietojumprogrammām, varat reģistrēties tiešraidē ar diennakts atbalstu un piekļuvi mūža garumā.