Python - programowanie gniazd

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łączenie, jak i dla 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.

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. Używamy modułu gniazda w Pythonie do tworzenia i używania gniazd.

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 na połączenie i SOCK_DGRAM dla protokołów bezpołączeniowych.

3

protocol

Zwykle zero, może to być wykorzystane 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.

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

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

Gniazdo z publicznym adresem URL

W poniższym przykładzie używamy kilku metod z modułu gniazda, aby znaleźć informacje adresowe serwera i szczegóły nazwy hosta.

import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()

Po uruchomieniu powyższego programu otrzymujemy następujący wynik -

[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP