Python - 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.

Gniazdo modułu

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 stworzenia 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ń 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/python           # This is server.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send('Thank you for connecting')
   c.close()                # Close the connection

Prosty klient

Napiszmy bardzo prosty program kliencki, który otwiera połączenie z podanym portem 12345 i podanym hostem. Utworzenie klienta gniazda przy użyciu funkcji modułu gniazda Pythona 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.

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/python           # This is client.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.

s.connect((host, port))
print s.recv(1024)
s.close()                     # Close the socket when done

Teraz uruchom ten server.py w tle, a następnie uruchom powyżej 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

Dałoby to następujący wynik -

Got connection from ('127.0.0.1', 48437)
Thank you for connecting

Moduły internetowe Python

Lista niektórych ważnych modułów programowania w sieci / Internecie w języku Python.

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 start z programowaniem w gniazdach. 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 .