Python 3 - programowanie sieciowe
Python zapewnia dwa poziomy dostępu do usług sieciowych. Na niskim poziomie można uzyskać dostęp do podstawowej obsługi gniazd w podstawowym systemie operacyjnym, co umożliwia implementację klientów i serwerów zarówno dla protokołów zorientowanych na połączenia, jak i protokołów bezpołączeniowych.
Python ma również biblioteki, które zapewniają wyższy poziom dostępu do określonych protokołów sieciowych na poziomie aplikacji, takich jak FTP, HTTP i tak dalej.
W tym rozdziale poznasz najsłynniejszą koncepcję sieci - programowanie za pomocą gniazd.
Co to są gniazda?
Gniazda to punkty końcowe dwukierunkowego kanału komunikacyjnego. Gniazda mogą komunikować się w ramach procesu, między procesami na tej samej maszynie lub między procesami na różnych kontynentach.
Gniazda mogą być implementowane w wielu różnych typach kanałów: gniazda domeny Unix, TCP, UDP i tak dalej. Gniazdo biblioteka zapewnia specyficzne klasy do obsługi wspólnych transportów, jak również ogólnego interfejsu do obsługi resztę.
Gniazda mają swoje własne słownictwo -
Sr.No. | Termin i opis |
---|---|
1 | domain Rodzina protokołów używanych jako mechanizm transportu. Te wartości są stałymi, takimi jak AF_INET, PF_INET, PF_UNIX, PF_X25 i tak dalej. |
2 | type Typ komunikacji między dwoma punktami końcowymi, zwykle SOCK_STREAM dla protokołów zorientowanych połączeniowo i SOCK_DGRAM dla protokołów bezpołączeniowych. |
3 | protocol Zwykle zero, można to wykorzystać do identyfikacji wariantu protokołu w domenie i typu. |
4 | hostname Identyfikator interfejsu sieciowego -
|
5 | port Każdy serwer nasłuchuje klientów dzwoniących na co najmniej jednym porcie. Port może być numerem portu Fixnum, ciągiem znaków zawierającym numer portu lub nazwą usługi. |
Moduł gniazda
Aby utworzyć gniazdo, musisz użyć funkcji socket.socket () dostępnej w module gniazda, która ma ogólną składnię -
s = socket.socket (socket_family, socket_type, protocol = 0)
Oto opis parametrów -
socket_family - To jest AF_UNIX lub AF_INET, jak wyjaśniono wcześniej.
socket_type - To jest SOCK_STREAM lub SOCK_DGRAM.
protocol - Zwykle jest to pomijane, domyślnie 0.
Gdy masz już obiekt gniazda , możesz użyć wymaganych funkcji do utworzenia programu klienta lub serwera. Poniżej znajduje się lista wymaganych funkcji -
Metody gniazda serwera
Sr.No. | Metoda i opis |
---|---|
1 | s.bind() Ta metoda wiąże adres (nazwa hosta, para numerów portów) z gniazdem. |
2 | s.listen() Ta metoda konfiguruje i uruchamia odbiornik TCP. |
3 | s.accept() To pasywnie akceptuje połączenie klienta TCP, czekając na nadejście połączenia (blokowanie). |
Metody gniazda klienta
Sr.No. | Metoda i opis |
---|---|
1 | s.connect() Ta metoda aktywnie inicjuje połączenie z serwerem TCP. |
Ogólne metody gniazd
Sr.No. | Metoda i opis |
---|---|
1 | s.recv() Ta metoda odbiera komunikat TCP |
2 | s.send() Ta metoda przesyła komunikat TCP |
3 | s.recvfrom() Ta metoda odbiera komunikat UDP |
4 | s.sendto() Ta metoda przesyła komunikat UDP |
5 | s.close() Ta metoda zamyka gniazdo |
6 | socket.gethostname() Zwraca nazwę hosta. |
Prosty serwer
Do pisania serwerów internetowych używamy rozszerzenia socketfunkcja dostępna w module gniazda w celu utworzenia obiektu gniazda. Obiekt gniazda jest następnie używany do wywoływania innych funkcji w celu skonfigurowania serwera gniazda.
Teraz zadzwoń do bind(hostname, port)funkcję, aby określić port dla usługi na danym hoście.
Następnie wywołaj metodę accept zwróconego obiektu. Ta metoda czeka, aż klient połączy się z określonym portem, a następnie zwraca obiekt połączenia, który reprezentuje połączenie z tym klientem.
#!/usr/bin/python3 # This is server.py file
import socket
# create a socket object
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# bind to the port
serversocket.bind((host, port))
# queue up to 5 requests
serversocket.listen(5)
while True:
# establish a connection
clientsocket,addr = serversocket.accept()
print("Got a connection from %s" % str(addr))
msg = 'Thank you for connecting'+ "\r\n"
clientsocket.send(msg.encode('ascii'))
clientsocket.close()
Prosty klient
Napiszmy bardzo prosty program kliencki, który otwiera połączenie z podanym portem 12345 i danym hostem. Utworzenie klienta gniazda za pomocą funkcji modułu gniazda w języku Python jest bardzo proste .
Plik socket.connect(hosname, port )otwiera połączenie TCP z nazwą hosta na porcie . Gdy masz otwarte gniazdo, możesz z niego czytać jak z każdego obiektu IO. Po zakończeniu pamiętaj, aby go zamknąć, tak jak zamknąłbyś plik.
Przykład
Poniższy kod to bardzo prosty klient, który łączy się z podanym hostem i portem, odczytuje wszystkie dostępne dane z gniazda, a następnie wychodzi -
#!/usr/bin/python3 # This is client.py file
import socket
# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# connection to hostname on the port.
s.connect((host, port))
# Receive no more than 1024 bytes
msg = s.recv(1024)
s.close()
print (msg.decode('ascii'))
Teraz uruchom ten server.py w tle, a następnie uruchom powyższy client.py, aby zobaczyć wynik.
# Following would start a server in background.
$ python server.py &
# Once server is started run client as follows:
$ python client.py
Wynik
Dałoby to następujący wynik -
on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting
Moduły internetowe Python
Lista niektórych ważnych modułów programowania sieci / Internetu w Pythonie jest podana poniżej -
Protokół | Wspólna funkcja | Port No | Moduł Pythona |
---|---|---|---|
HTTP | strony internetowe | 80 | httplib, urllib, xmlrpclib |
NNTP | Wiadomości Usenet | 119 | nntplib |
FTP | Przesyłanie plików | 20 | ftplib, urllib |
SMTP | Wysyłać email | 25 | smtplib |
POP3 | Pobieranie e-maila | 110 | poplib |
IMAP4 | Pobieranie e-maila | 143 | imaplib |
Telnet | Linie poleceń | 23 | telnetlib |
Suseł | Przesyłanie dokumentów | 70 | gopherlib, urllib |
Sprawdź wszystkie biblioteki wymienione powyżej, aby współpracowały z protokołami FTP, SMTP, POP i IMAP.
Dalsze lektury
To był szybki początek programowania za pomocą gniazd. To obszerny temat. Zaleca się przejście przez poniższy link, aby znaleźć więcej szczegółów -
Programowanie gniazd w systemie Unix .
Biblioteka i moduły gniazd Pythona .