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 -

  • Ciąg, który może być nazwą hosta, adresem z kropkami lub adresem IPV6 w notacji z dwukropkiem (i prawdopodobnie kropką)

  • Ciąg „<broadcast>”, który określa adres INADDR_BROADCAST.

  • Ciąg o zerowej długości, który określa INADDR_ANY lub

  • Liczba całkowita interpretowana jako adres binarny w kolejności bajtów hosta.

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 .