Python

Pošiljajte in prejemajte pakete UDP prek Pythona

Pošiljajte in prejemajte pakete UDP prek Pythona
Že poznamo dva glavna protokola transportne plasti, kot sta TCP in UDP. Za več informacij o TCP in UDP si lahko ogledate referenčni odsek.  V tem članku se bomo naučili pošiljanja in prejemanja paketov UDP s pomočjo programa python.

Pričakovanja:

Tu je nekaj ključnih točk, ki se jih lahko naučimo iz tega članka

  1. Pošiljanje besedila s programom python, ki uporablja protokol UDP.
  2. Prejemanje besedila s pomočjo programa python, ki uporablja protokol UDP.
  3. Preverite paket UDP v Wireshark.
  4. Spoznajte python kodo za pošiljanje in prejemanje paketov UDP.

Diagram splošne nastavitve:

Sistem A in B bi moral imeti možnost medsebojnega pinga.

Predpostavke ali omejitve:

  1. Oba sistema bi morala imeti Linux z Ubuntujem. Koda lahko deluje ali pa tudi ne v drugih operacijskih sistemih, kot so Windows10, MAC itd.
  2. Oba sistema bi morala imeti različico python 3. Ta koda lahko ali pa tudi ne deluje na python 2.7 različica.

Opomba: referenco za preizkušanje pošiljanja in prejemanja paketov UDP prek Linux CLI lahko preverite, preden datoteke python opravijo isto nalogo.

Datoteke Python:

Obstajata dve datoteki python strežnik.py in stranka.py. Datoteka strežnika in datoteka odjemalca morata biti prisotni v strežniškem in odjemalskem sistemu.

Strežnik.py

uvozna vtičnica
uvoz sys
če je len (sys.argv) == 3:
# Pridobite "IP naslov strežnika" in tudi "številko vrat" od
argument 1 in argument 2
ip = sys.argv [1]
port = int (sys.argv [2])
sicer:
print ("Zaženi kot: strežnik python3.py ")
izhod (1)
# Ustvarite UDP vtičnico
s = vtičnica.vtičnica (vtičnica.AF_INET, vtičnica.SOCK_DGRAM)
# Priključite vtičnico na vrata
server_address = (ip, vrata)
s.veži (naslov_strežnika)
print ("Za izhod iz programa naredite Ctrl + c !!")
medtem ko je True:
print ("####### Server streže #######")
podatki, naslov = s.recvfrom (4096)
natisni ("\ n \ n 2. Strežnik je prejel: ", data.decode ('utf-8'), "\ n \ n")
send_data = input ("Vnesite besedilo za pošiljanje =>")
s.sendto (send_data.encode ('utf-8'), naslov)
natisni ("\ n \ n 1. Strežnik poslan: ", send_data," \ n \ n ")

Naročnik.py

uvozna vtičnica
uvoz sys
če je len (sys.argv) == 3:
# Pridobite "IP naslov strežnika" in tudi "številko vrat" iz argumenta 1 in argumenta 2
ip = sys.argv [1]
port = int (sys.argv [2])
sicer:
print ("Zaženi kot: odjemalec python3.py ")
izhod (1)
# Ustvari vtičnico za strežnik
s = vtičnica.vtičnica (vtičnica.AF_INET, vtičnica.SOCK_DGRAM, 0)
print ("Za izhod iz programa naredite Ctrl + c !!")
# Pošiljajmo podatke po protokolu UDP
medtem ko je True:
send_data = input ("Vnesite besedilo, ki ga želite poslati =>");
s.sendto (send_data.encode ('utf-8'), (ip, port))
natisni ("\ n \ n 1. Stranka poslana: ", send_data," \ n \ n ")
podatki, naslov = s.recvfrom (4096)
natisni ("\ n \ n 2. Naročnik je prejel: ", podatki.decode ('utf-8'), "\ n \ n")
# zaprite vtičnico
s.zapri ()

Pošiljanje / prejemanje paketa UDP:

Vzemimo primer, kot da bomo paket UDP poslali iz sistema A v sistem B. Torej, v konceptu strežnik-odjemalec moramo strežnik zagnati na strani sistema B, odjemalca pa na strani sistema A.

Imamo tudi veljavne naslove IP.

Sistem A IP: 192.168.1.6
Sistem B IP: 192.168.1.102

Zdaj bomo za razliko od pošiljanja in prejemanja paketov UDP prek Linux CLI izvajali strežnik.py v sistemu, B [192.168.1.102] in potem bomo tekli stranka.py v sistemu A [192.168.1.6].

Kako zagnati strežnik.py leta 192.168.1.102?

Tu je ukaz za zagon strežnika.py

$ python3 strežnik.py 192.168.1.102 4444

Tu je posnetek zaslona

Tu sta dva argumenta za program python. 1st argument je naslov IP samega strežnika, tukaj je 192.168.1.102 in 2nd argument je vrata, kateri strežnik bo poslušal, tukaj smo izbrali 4444.

Kako zagnati stranko.py leta 192.168.1.6?

Tu je ukaz za zagon odjemalca.py

$ python3 odjemalec.py 192.168.1.102 4444

Tu je posnetek zaslona

Tu sta dva argumenta za program python. 1st argument je naslov IP strežnika, tukaj je 192.168.1.102 in 2nd argument je vrata, kjer se izvaja strežnik. V našem primeru je 4444.

Pošljite ali prejmite nekaj besedila:

Kot lahko vidite, smo pripravljeni na komunikacijo med dvema sistemoma. Najprej pa moramo začeti od stranke. Vtipkajmo nekaj v odjemalca in preverimo, ali seže do strežnika ali ne.

Pošlji podatke od stranke: "Sem od stranke"

Odjemalec obrazca zaslona:

Zdaj mora to sporočilo odjemalca priti na strežnik. Tu je posnetek zaslona strežnika.

Zdaj lahko na strani strežnika vidimo tudi možnost, da stranki pošljemo nekaj. Poskusimo to.

Pošlji podatke od stranke: "Sem iz strežnika"

Posnetek zaslona strežnika:

In tukaj je posnetek zaslona na strani odjemalca.

Zdaj bo to trajalo neskončno, dokler ne zaustavimo programa python s pomočjo Ctrl + c.

Preverite paket UDP v Wireshark:

Zdaj smo že izvedli nekaj komunikacije, a kako naj vemo, da je bil UDP uporabljen za pošiljanje ali prejemanje teh paketov. Torej lahko preverimo zajem v Wiresharku.

Poglejmo paket, ko odjemalec [192.168.1.6] poslal podatke [»Sem od stranke«] na strežnik [192.168.1.6].

Razlaga kode:

Za razlago osnovne kode python glejte »Pošiljanje datoteke za prenos datotek vtičnice Python« v referenčnem poglavju.

Razložili bomo samo pomembne kode vrstic za datoteko odjemalca in strežnika python. V odjemalski in strežniški kodi so uporabni komentarji.

Razlaga odjemalske kode:

če je len (sys.argv) == 3:

Zgornja vrstica je potrebna za preverjanje, ali je uporabnik posredoval zahtevane obvezne argumente. V nasprotnem primeru bo program zapustil. Enako preverjanje je tudi v strežniškem programu.

s = vtičnica.vtičnica (vtičnica.AF_INET, vtičnica.SOCK_DGRAM, 0)

Zgornja vrstica je ustvariti vtični strežnik z UDP [SOCK_DGRAM] protokola. Ista koda je na strežniku.py.

medtem ko je True:

Zagon programa v neskončni zanki, dokler uporabnik ne stori Ctrl + c. Ista koda je na strežniku.py.

s.sendto (send_data.encode ('utf-8'), (ip, port))

Če želite poslati podatke za omenjene ip in pristanišče številko.

podatki, naslov = s.recvfrom (4096)

Za sprejem podatkov, ki prihajajo s strežnika. Ista koda je na strežniku.py.

Razlaga strežniške kode:

s.sendto (send_data.encode ('utf-8'), naslov)

Pošljite podatke na naslov stranke.

Zaključek:

Podatke UDP lahko pošiljamo ali prejemamo s programom python. Interno uporablja strežniški odjemalski mehanizem.

Reference:

Za razumevanje TCP: https: // linuxhint.com / tcp_packet_capture_analysis /
Za razumevanje UDP: https: // linuxhint.com / udp_wireshark_analysis /
Pošiljanje in prejemanje paketov UDP prek Linux CLI:
https: // linuxhint.com / send_receive_udp_packets_linux_cli /
Pošiljanje datoteke s prenosom vtičnice Python:
https: // linuxhint.com / python_socket_file_transfer_send /

Kako namestiti in igrati Doom v Linuxu
Uvod v Doom Serija Doom je nastala v devetdesetih letih po izidu prvotnega Dooma. Bil je takojšen hit in od takrat naprej je serija iger prejela števi...
Vulkan za uporabnike Linuxa
Z vsako novo generacijo grafičnih kart vidimo, da razvijalci iger premikajo meje grafične zvestobe in se približujejo fotorealizmu. A kljub vsem kredi...
OpenTTD vs Simutrans
Ustvarjanje lastne simulacije prevoza je lahko zabavno, sproščujoče in izjemno vabljivo. Zato morate preizkusiti čim več iger, da boste našli tisto, k...