Wyślij i odbieraj pakiety UDP za pośrednictwem Python

Wyślij i odbieraj pakiety UDP za pośrednictwem Python
Wiemy już o dwóch głównych protokołach warstwy transportowej, takich jak TCP i UDP. Aby uzyskać więcej informacji na temat TCP i UDP, możesz sprawdzić sekcję referencyjną. W tym artykule dowiemy się, jak wysyłać i odbierać pakiety UDP za pomocą programu Python.

Oczekiwania:

Oto kilka kluczowych punktów z tego artykułu

  1. Wysyłanie tekstu za pomocą programu Python, który korzysta z protokołu UDP.
  2. Otrzymanie tekstu za pomocą programu Python, który korzysta z protokołu UDP.
  3. Sprawdź pakiet UDP w Wireshark.
  4. Dowiedz się o kodzie Python, aby wysłać i odbierać pakiety UDP.

Ogólny schemat:

System A i B powinien sobie w stanie pingować.

Założenia lub ograniczenia:

  1. Oba systemy powinny mieć Linux z Ubuntu. Kod może, ale nie musi działać na innym systemie operacyjnym, takim jak Windows10, Mac.
  2. Oba systemy powinny mieć Python wersja 3. Ten kod może, ale nie musi działać na Python 2.7 wersja.

Uwaga: możesz sprawdzić referencję w celu wypróbowania wysyłania i odbierania pakietów UDP przez Linux CLI przed pójściem na pliki Python, aby wykonać to samo zadanie.

Pliki Pythona:

Istnieją dwa pliki Pythona serwer.py I klient.py. Plik serwera i plik klienta powinny być obecne odpowiednio w systemie serwera i systemie klienta.

serwer.py

Gniazdo importu
Import Sys
Jeśli Len (sys.argv) == 3:
# Pobierz „Adres IP serwera”, a także „numer portu” z argumentu 1 i argumentu 2
ip = Sys.Argv [1]
port = int (sys.Argv [2])
w przeciwnym razie:
Drukuj („Uruchom jak: serwer Python3.py ")
Wyjście (1)
# Utwórz gniazdo UDP
S = gniazdo.gniazdo (gniazdo.AF_INET, gniazdo.Sock_dgram)
# Związaj gniazdo z portem
server_address = (IP, port)
S.bind (server_address)
wydrukuj („do Ctrl+C, aby wyjść z programu !!")
Choć prawda:
print („######## Serwer słuchamy ######”)
dane, adres = s.recvfrom (4096)
wydrukuj ("\ n \ n 2. Otrzymano serwer: ", dane.Decode ('utf-8'), „\ n \ n”)
send_data = input ("wpisz trochę tekstu do send =>")
S.sendTO (send_data.enkoduj („UTF-8”), adres)
Drukuj ("\ n \ n 1. Serwer wysłany: ", send_data," \ n \ n ")

Klient.py

Gniazdo importu
Import Sys
Jeśli Len (sys.argv) == 3:
# Pobierz „Adres IP serwera”, a także „numer portu” z argumentu 1 i argumentu 2
ip = Sys.Argv [1]
port = int (sys.Argv [2])
w przeciwnym razie:
Drukuj („Run Like: Python3 Klient.py ")
Wyjście (1)
# Utwórz gniazdo dla serwera
S = gniazdo.gniazdo (gniazdo.AF_INET, gniazdo.Sock_dgram, 0)
wydrukuj („do Ctrl+C, aby wyjść z programu !!")
# Wyślijmy dane za pośrednictwem protokołu UDP
Choć prawda:
send_data = input („wpisz trochę tekstu do send =>”);
S.sendTO (send_data.enkoduj ('utf-8'), (ip, port))
Drukuj ("\ n \ n 1. Klient wysłał: ", send_data," \ n \ n ")
dane, adres = s.recvfrom (4096)
wydrukuj ("\ n \ n 2. Otrzymane klient: ", dane.Decode ('utf-8'), „\ n \ n”)
# Zamknij gniazdo
S.zamknąć()

Wyślij/odbieraj pakiet UDP:

Weźmy przykład, jakbyśmy wyśle ​​pakiet UDP z systemu A do systemu B. Tak więc, w koncepcji serwera-klienta, musimy uruchomić serwer po stronie systemu B i klienta po stronie systemu.

Mamy również prawidłowe adresy IP.

System IP: 192.168.1.6
System B IP: 192.168.1.102

Teraz, w przeciwieństwie do wysyłania i odbierania pakietów UDP przez Linux CLI serwer.py w systemie, b [192.168.1.102], a potem będziemy uruchomić klient.py W systemie A [192.168.1.6].

Jak uruchomić serwer.PY w 192 roku.168.1.102?

Oto polecenie uruchamiania serwera.py

$ Python3 Serwer.PY 192.168.1.102 4444

Oto zrzut ekranu

Tutaj istnieją dwa argumenty dotyczące programu Python. 1St Argument to adres IP samego serwera, tutaj 192.168.1.102 i 2Nd Argument to port, którego serwer będzie słuchał, tutaj wybraliśmy 4444.

Jak uruchomić klienta.PY w 192 roku.168.1.6?

Oto polecenie uruchomienia klienta.py

$ Python3 Klient.PY 192.168.1.102 4444

Oto zrzut ekranu

Tutaj istnieją dwa argumenty dotyczące programu Python. 1St Argument to adres IP serwera, tutaj jego 192.168.1.102 i 2Nd Argument to port, w którym działa serwer. W naszym przykładzie jest to 4444.

Wyślij lub odbieraj SMS:

Teraz, jak widać, jesteśmy gotowi komunikować się między dwoma systemami. Ale najpierw musimy zacząć od klienta. Wpiszmy coś w kliencie i sprawdź, czy sięgnie do serwera, czy nie.

Wyślij dane z klienta: „Jestem z klienta”

Klient z ekranu z ekranu:

Teraz ta wiadomość klienta powinna przyjechać na serwer. Oto zrzut ekranu serwera.

Teraz możemy zobaczyć po stronie serwera, mamy również opcję wysłania czegoś do klienta. Spróbujmy tego.

Wyślij dane z klienta: „Jestem z serwera”

Server Screenshot:

A oto zrzut ekranu po stronie klienta.

Teraz będzie to trwające nieskończone czasy, dopóki nie zatrzymamy programu Python za pomocą Ctrl+C.

Sprawdź pakiet UDP w Wireshark:

Teraz przeprowadziliśmy komunikację, ale jak dowiemy się, że UDP był używany do wysyłania lub odbierania tych pakietów. Możemy więc sprawdzić przechwytywanie w Wireshark.

Zobaczmy pakiet, gdy klient [192.168.1.6] Wysłano dane [„Jestem z klienta”] na serwer [192.168.1.6].

Objaśnienie kodu:

Podstawowe wyjaśnienie kodu Pythona Patrz „Przesyłanie pliku gniazda Pythona” w sekcji referencyjnej.

Wyjaśnimy tylko ważne kody linii dla pliku klienta i serwera Pythona. W kodzie klienta i serwera znajdują się przydatne komentarze.

Objaśnienie kodu klienta:

Jeśli Len (sys.argv) == 3:

Powyższa linia jest wymagana do sprawdzenia, czy użytkownik zdał wymagane obowiązkowe argumenty. Albo program wyjdzie. Ten sam czek jest w programie serwerowym.

S = gniazdo.gniazdo (gniazdo.AF_INET, gniazdo.Sock_dgram, 0)

Powyższa linia to tworzenie serwera gniazda za pomocą UDP [Sock_dgram] protokół. Ten sam kod jest na serwerze.py.

Choć prawda:

Aby uruchomić program w Infinite Loop, dopóki użytkownik nie zrobi Ctrl+C. Ten sam kod jest na serwerze.py.

S.sendTO (send_data.enkoduj ('utf-8'), (ip, port))

Wysłać dane do wspomnianych ip I Port numer.

dane, adres = s.recvfrom (4096)

Aby odebrać dowolne dane pochodzące z serwera. Ten sam kod jest na serwerze.py.

Objaśnienie kodu serwera:

S.sendTO (send_data.enkoduj („UTF-8”), adres)

Wyślij dane na adres klienta.

Wniosek:

Możemy wysyłać lub odbierać dane UDP za pomocą programu Python. Wewnętrznie wykorzystuje mechanizm klienta serwera.

Bibliografia:

Aby zrozumieć TCP: https: // linuxhint.com/tcp_packet_capture_analysis/
Aby zrozumieć UDP: https: // Linuxhint.com/udp_wireshark_analysis/
Wyślij i odbieraj pakiety UDP przez Linux CLI:
https: // linuxhint.com/send_receive_udp_packets_linux_cli/
Przesyłanie pliku gniazda Pythona Wyślij:
https: // linuxhint.com/python_socket_file_transfer_send/