Programowanie w języku Python - zanim zacznę od programowania w języku Python, mam nadzieję, że znasz dobre podstawy języka Python. Jeśli znasz również Django, byłoby to jeszcze łatwiejsze do zrozumienia. Nie, programowanie gniazd nie jest związane z Django, ale terminologie w programowaniu gniazd Python i Django są prawie takie same, chociaż są to dwie różne kategorie. Na początek, czym dokładnie jest programowanie w języku Python? Programowanie w języku Python Socket występuje nie tylko w języku Python, ale także w Javie i prawie we wszystkich innych językach programowania. Ale w przypadku Pythona programowanie gniazd jest w rzeczywistości bardzo łatwe do zrozumienia. Programowanie w języku Python Socket oznacza programowanie sieciowe. Obejmuje kody po stronie klienta i kody po stronie serwera Python Socket. Ale ta definicja jest tak dobra, jak książka, w której napisano, że programowanie C jest używane do tworzenia oprogramowania. I nie, nie jestem tu po to. Jestem tutaj, aby upewnić się, że lepiej rozumiesz podstawy programowania gniazd w Pythonie, zanim zaczniesz pisać własne moduły gniazd. Zacznijmy więc i zobaczmy, jak działa gniazdo po stronie klienta lub po stronie serwera Python Socket.

Co to jest programowanie gniazd Python?

Jeśli nauczyłeś się programowania w C, to nauka programowania w języku Python w Pythonie byłaby bardzo łatwa, ponieważ są prawie takie same. Aby uprościć to, programowanie gniazd Pythona jest po prostu kodem informującym o tym, jak komputery w sieci komunikują się ze sobą. I to nie kończy się na sieci LAN, obsługuje także sieci WAN, MAN i sieci intranetowe. Używamy nawet gniazd w codziennym życiu. Nie rozumiem? Dam ci prosty przykład. Kiedy chcesz się połączyć, powiedzmy Facebook.com, po prostu wpisz to samo w pasku adresu URL. Tak właśnie utworzone połączenie nie jest tworzone tylko przez DNS. Wszystko to jest konfigurowane poprzez programowanie gniazd Pythona. Gniazda decydują o sposobie komunikacji dwóch sieci. Każda komunikacja prowadzona przez sieć, może to być wideo, połączenia VoIP lub zwykły tekst; wszystko przechodzi przez gniazdo. Teraz, gdy wiemy, co to są gniazda, opracujmy własne gniazdo w języku python.

Źródło obrazu: pixabay.com

Rodzaje programowania gniazd w języku Python

Teraz jest tam mnóstwo gniazd. Ale nie będziemy rozmawiać o nich wszystkich, ponieważ nie mogę tutaj opisać ich wszystkich. Możesz albo utworzyć gniazdo UDP, gniazdo TCP, a nawet gniazdo portu, a jeśli pójdę dalej, będzie ich o wiele więcej. Ale chciałbym dziś bardziej przyjrzeć się gniazdom TCP i UDP, ponieważ są one najbardziej podstawowe i mogą być bardzo dobre jako punkt początkowy, aby rozpocząć programowanie w języku Python Socket.

  • Programowanie gniazd UDP

User Datagram Protocol lub powszechnie znany jako UDP jest protokołem alternatywnym do TCP, który przenosi pakiety z jednego hosta na inny. Ale w przeciwieństwie do TCP (protokół kontroli transmisji), UDP jest protokołem bezpołączeniowym i nie jest zorientowany na strumień. Oznacza to, że serwer UDP będzie przechwytywał tylko przychodzące pakiety z całego hosta bez identyfikowania niezawodnego połączenia źródłowego. W tym celu użyjemy funkcji socket.socket. Proste gniazdo UDP jest tworzone w Pythonie w następujący sposób:

import socket #importing module socket from Python library # Teraz musimy utworzyć AF_INET i sock dgram socketss = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) wypisać „Socket Creation Successful”

Tak. To wszystko i w Pythonie stworzyliśmy proste gniazdo UDP. Programowanie w gniazdach Python, a nawet tworzenie prostych gniazd nie jest nauką rakietową. Jednak najważniejsza jest kodowanie serwera UDP i klienta. Ponieważ gniazda UDP są bezpołączeniowe, komunikacja jest inicjowana za pomocą funkcji wysyłania i odbierania gniazd. Te funkcje nie wymagają ich połączenia. Mogą faktycznie wysyłać i odbierać pakiety z dowolnego losowego źródła. Oto jak tworzony jest serwer UDP:

import socketport = 2924s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM) s.bind ((„”, port)) drukuj „Żądanie połączenia z portem na komputerze”, port

podczas gdy 1:

dane, adres = s.recvfrom (1024)

wydrukować dane

To może nie wydawać się wiele, ale tak właśnie powstaje. Można tu użyć dowolnego portu. Właśnie wybrałem losowy jako 2924. Serwer UDP potrzebuje portu, aby był otwarty do wysyłania i odbierania połączeń przychodzących. Nie ma nasłuchiwania portu ani przyjmowania połączeń ani żądań. To się po prostu dzieje bez żadnego uwierzytelnienia. Spróbuj uruchomić powyższy serwer na terminalu i sprawdź, jak to działa.

To tylko prosty serwer UDP, który stworzyliśmy. Zróbmy to trochę bardziej interesującym, a także nieco bardziej skomplikowanym:

„To jest prosty serwer z gniazdami UDP” ”import sim socketimport

HOST = „” # Można tutaj wypróbować wszystkie dostępne interfejsy

PORT = 2924 # Dowolny losowy port, który nie jest domyślnie używany w dystrybucji Windows lub Linux

# Kodowanie gniazda UDP

próbować :

s = gniazdo.socket (gniazdo.AF_INET, gniazdo.SOCK_DGRAM)

drukuj „Inicjalizacja gniazda”

z wyjątkiem socket.error, msg:

print „Utworzenie gniazda nie powiodło się. Wystąpił następujący błąd: ”+ str (msg (0)) +„ Message ”+ msg (1)

sys.exit ()

# Teraz musimy powiązać to gniazdo z powyższym hostem i portem

próbować:

s.bind ((HOST, PORT))

z wyjątkiem socket.error, msg:

print „Socket Binding nie powiodło się. Następujący błąd przerwał wiązanie: ”+ str (msg (0)) +„ Wiadomość ”+ msg (1)

sys.exit ()

drukuj „Wiązanie gniazda zakończone”

# Zachowaj ustanowione połączenie

podczas gdy 1:

# przechwytywanie danych od klienta przy użyciu zmiennych danych i adresu

d = s.recvfrom (1024)

dane = d (0)

adres = d (1)

jeśli nie dane:

przerwa

odpowiedz = „OK…” + dane

s.sendto (odpowiedź, adres)

print 'Token message (' + address (0) + ':' + str (address (1)) + ') -' + data.strip ()

s.close ()

Uruchom powyższy program, a uruchomisz serwer UDP na porcie 2924. Gratulacje, pomyślnie utworzyłeś Socket w Pythonie. I pamiętaj, że pamiętasz, że serwer UDP może obsłużyć wiele klientów w przeciwieństwie do serwera TCP, głównym powodem jest brak stałej łączności na serwerze UDP, tak jak w przypadku serwera TCP.

Polecane kursy

  • Kurs certyfikacji z debugowania w języku Ruby
  • Kurs PHP MySQL
  • Kurs certyfikacji programowania VB.NET
  • Ukończ szkolenie ITIL Foundation
  • Programowanie klienta UDP

Teraz, gdy udało nam się stworzyć Serwer UDP, potrzebujemy klienta, aby ustanowił odpowiednie połączenie z nim, abyśmy wiedzieli, jak działa. Pracujmy więc nad stworzeniem odpowiedniego klienta UDP w Pythonie. Ten klient połączy się z naszym serwerem UDP, który utworzyliśmy powyżej:

”„ Tworzenie prostego klienta UDP przy użyciu gniazd ”” import sys socketimport

# Tworzenie gniazda UDP

próbować:

s = gniazdo.socket (gniazdo.AF_INET, gniazdo.SOCK_DGRAM)

z wyjątkiem socket.error:

print „Utworzenie gniazda nie powiodło się”

sys.exit ()

host = „127.0.0.1”; # Możesz także spróbować użyć adresu IP hosta lokalnego hosta tego adresu IP, oba są takie same.

port = 2924;

podczas gdy (1):

msg = raw_input ('Wpisz wiadomość do wysłania na serwer:')

próbować :

# Teraz musimy ustawić ciągi

s.sendto (msg, (host, port))

# Teraz musimy odbierać dane i adres od klienta za pomocą danych i adresu

d = s.recvfrom (1024)

odpowiedź = d (0)

adres = d (1)

print „Odpowiedź z serwera to:” + odpowiedź

z wyjątkiem socket.error, msg:

print „Pojawił się błąd:„ + str (msg (0)) + „Message” + msg (1)

sys.exit ()

Tak. Tworzenie klienta UDP w programowaniu Python Socket jest znacznie łatwiejsze niż tworzenie serwera UDP. Ale tak to wygląda. Nie sądzę, że musiałbym wyjaśniać cokolwiek z powyższego fragmentu kodu, ponieważ wspomniałem już wszystkie wymagane rzeczy w komentarzach # tag. Upewnij się tylko, że adres IP i port, który wprowadziłeś są prawidłowe, a zapora sieciowa nie blokuje połączenia, w przeciwnym razie zawsze spowoduje to awarię, bez względu na wszystko.

  • Programowanie gniazd TCP

Teraz, gdy nauczyliśmy się tworzyć klienta i serwer UDP, przyjrzyjmy się programowaniu gniazd TCP. Będziemy używać tej samej funkcji socket.socket do utworzenia gniazda TCP tutaj.

import socket # Importowanie gniazda modułu z bibliotek Pythona # utwórz AF_INET i strumieniuj gniazda = socket.socket (socket.AF_INET, socket.SOCK_STREAM) wypisz „Socket Creation Successful”

W tym przypadku AF_INET służy do połączenia adresu IPv4, a strumień skarpety jest protokołem zorientowanym na TCP. Jest to proste gniazdo TCP, które stworzyliśmy. Teraz będziemy tworzyć zaawansowaną wersję tego samego. Będziemy tu również wprowadzać wyjątki, tak samo jak rzucaliśmy to podczas tworzenia serwerów i klientów UDP, aby w przypadku awarii połączenia dowiemy się, gdzie leży rzeczywisty program. Socket.error będzie używany do obsługi wszystkich tych błędów podobnych do błędów programowania UDP.

Teraz stwórzmy gniazdo z powyższą obsługą błędów i połączmy się z hostem facebook.com. Oto jak należy to zrobić:

import socket #importing the module moduleimport systry: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

z wyjątkiem socket.error, msg:

print 'Utworzenie gniazda nie powiodło się. Wystąpił następujący błąd: „+ str (msg (0)) +”, komunikat o błędzie: „+ msg (1)

sys.exit ();

drukuj „Socket Creation udane”

host = „www.facebook.com”

port = 2924

próbować:

remote_ip = socket.gethostbyname (host)

z wyjątkiem socket.gaierror:

print „Nieprawidłowa nazwa hosta. Opuszczam…

sys.exit ()

print ”+ host + adres IP” to „+ remote_ip

s.connect ((remote_ip, port))

wydrukuj 'Socket Connected to' + host + 'on ip' + remote_ip

To wystarczy, jeśli będziemy potrzebować tylko połączenia. Ale to nie jest nasz cel. Zamierzamy stworzyć połączenie, w którym moglibyśmy również wysyłać i odbierać dane na obu końcach. Możemy wysyłać dane za pomocą funkcji sendall. Oto, jak to wygląda:

import socket #importing the module moduleimport systry: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

z wyjątkiem socket.error, msg:

print 'Utworzenie gniazda nie powiodło się. Wystąpił następujący błąd: „+ str (msg (0)) +”, komunikat o błędzie: „+ msg (1)

sys.exit ();

drukuj „Socket Creation udane”

host = „www.facebook.com”

port = 2924

próbować:

remote_ip = socket.gethostbyname (host)

z wyjątkiem socket.gaierror:

print „Nieprawidłowa nazwa hosta. Opuszczam…

sys.exit ()

print ”+ host + adres IP” to „+ remote_ip

s.connect ((remote_ip, port))

wydrukuj 'Socket Connected to' + host + 'on ip' + remote_ip

# przesyłanie danych za pomocą funkcji sendall

message = „GET / HTTP / 1.1 \ r \ n \ r \ n”

próbować :

s.sendall (wiadomość)

z wyjątkiem socket.error:

#Wysyłanie nie powiodło się

drukuj „Błąd transmisji”

sys.exit ()

wydrukuj „Status wiadomości: Wysłano”

Teraz, gdy utworzyliśmy udane połączenie i możemy również wysyłać dane, przyjrzyjmy się, w jaki sposób możemy w ogóle uzyskać dane. Tak to wygląda:

import socket #importing the module moduleimport systry: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

z wyjątkiem socket.error, msg:

print 'Utworzenie gniazda nie powiodło się. Wystąpił następujący błąd: „+ str (msg (0)) +”, komunikat o błędzie: „+ msg (1)

sys.exit ();

drukuj „Socket Creation udane”

host = „www.facebook.com”

port = 2924

próbować:

remote_ip = socket.gethostbyname (host)

z wyjątkiem socket.gaierror:

print „Nieprawidłowa nazwa hosta. Opuszczam…

sys.exit ()

print ”+ host + adres IP” to „+ remote_ip

s.connect ((remote_ip, port))

wydrukuj 'Socket Connected to' + host + 'on ip' + remote_ip

# przesyłanie danych za pomocą funkcji sendall

message = „GET / HTTP / 1.1 \ r \ n \ r \ n”

próbować :

s.sendall (wiadomość)

z wyjątkiem socket.error:

#Wysyłanie nie powiodło się

drukuj „Błąd transmisji”

sys.exit ()

wydrukuj „Status wiadomości: Wysłano”

# Teraz, aby otrzymać dane, używamy do tego celu funkcji recv

odpowiedz = s.recv (4096)

wydrukuj odpowiedź

Ostatnią rzeczą jest zamknięcie gniazda, które możemy to zrobić za pomocą następującego kodu:

s.close ()

I wreszcie część wiążąca. Możemy użyć funkcji bind do powiązania gniazd z adresami IP i portami.

import socketimport sysHOST = ”#To samo dzieje się w przypadku protokołu UDPPORT = 2924 # portu dostępu do danych.

s = gniazdo.socket (gniazdo.AF_INET, gniazdo.SOCK_STREAM)

drukuj „Utworzenie gniazda zakończyło się powodzeniem”

próbować:

s.bind ((HOST, PORT))

z wyjątkiem socket.error, msg:

print „Powiązanie nie powiodło się. Wystąpił błąd „+ str (msg (0)) +„ Wiadomość ”+ msg (1)

sys.exit ()

drukuj „Socket Binding udane”

Teraz musimy nasłuchiwać połączeń przychodzących, jeśli potrzebujemy serwera, aby się połączyć. Można to zrobić za pomocą następującego prostego polecenia:

s.listen (10) print „Listener start”

Na koniec musimy utworzyć gniazdo, aby zaakceptować te połączenia:

import socketimport sysHOST = ”PORT = 2924

s = gniazdo.socket (gniazdo.AF_INET, gniazdo.SOCK_STREAM)

drukuj „Socket Creation udane”

próbować:

s.bind ((HOST, PORT))

z wyjątkiem socket.error, msg:

print „Powiązanie nie powiodło się. Wystąpił błąd „+ str (msg (0)) +„ Wiadomość ”+ msg (1)

sys.exit ()

drukuj „Wiązanie gniazda udane”

s.listen (10)

drukuj „Słuchacz rozpoczęty”

# Akceptowanie połączeń

conn, addr = s.accept ()

# Podanie informacji o podłączonym kliencie

print 'Połączenie ustanowione za pomocą' + addr (0) + ':' + str (addr (1))

W rzeczywistości jest o wiele więcej. Możemy również pisać kody dla handlerów i innych rzeczy. Ale myślę, że to na razie tyle. Upewnij się, że te podstawy są prawidłowe, po czym pozostałe części to tylko bułka z masłem do nauki.

Pierwsze źródło obrazu: pixabay.com

Powiązane artykuły:-

Oto kilka artykułów, które pomogą ci uzyskać więcej szczegółów na temat programowania gniazd Python, więc po prostu przejdź przez link.

  1. 25 najbardziej niesamowitych pytań i odpowiedzi podczas wywiadu w języku Python
  2. Kariera w Pythonie
  3. Jakie są zalety i ograniczenia używania Pythona?
  4. Ważna różnica Python vs. Ruby Performance
  5. Wprowadzenie do programowania gniazd w PHP
  6. Programowanie gniazd w Javie | Metoda klasy gniazda