Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Python

Python Netwerkprogrammering: Sockets & Geavanceerde Protocols onder de knie

Python biedt twee niveaus van toegang tot netwerkservices. Op een laag niveau kunt u de basis socket-ondersteuning in het onderliggende besturingssysteem benaderen, waarmee u clients en servers kunt implementeren voor zowel verbindingsgeoriënteerde als verbindingsloze protocollen.

Python heeft ook bibliotheken die hogere toegang bieden tot specifieke applicatienetwerkprotocollen, zoals FTP, HTTP, enzovoort.

Dit hoofdstuk geeft u inzicht in het meest bekende concept in Netwerken - Socket Programmeren.

Wat zijn Sockets?

Sockets zijn de eindpunten van een bidirectioneel communicatiekanaal. Sockets kunnen communiceren binnen een proces, tussen processen op dezelfde machine, of tussen processen op verschillende continenten.

Sockets kunnen geïmplementeerd worden over verschillende kanaltypen: Unix domein sockets, TCP, UDP, enzovoort. De socket-bibliotheek biedt specifieke klassen voor het afhandelen van de veelvoorkomende transporten alsook een generieke interface voor de rest.

Sockets hebben hun eigen vocabulaire:

Nr. Term & Beschrijving
1

Domein

De familie van protocollen die gebruikt wordt als transportmechanisme. Deze waarden zijn constanten zoals AF_INET, PF_INET, PF_UNIX, PF_X25, enzovoort.

2

type

Het type communicatie tussen de twee eindpunten, meestal SOCK_STREAM voor verbindingsgeoriënteerde protocollen en SOCK_DGRAM voor verbindingsloze protocollen.

3

protocol

Meestal nul, dit kan gebruikt worden om een variant van een protocol binnen een domein en type te identificeren.

4

hostname

De identifier van een netwerkinterface:

  • Een string, die een hostnaam, een dotted-quad adres, of een IPV6-adres in dubbele punt (en mogelijk punt) notatie kan zijn

  • Een string "<broadcast>", die een INADDR_BROADCAST-adres specificeert.

  • Een string met lengte nul, die INADDR_ANY specificeert, of

  • Een Integer, geïnterpreteerd als een binair adres in host byte order.

5

poort

Elke server luistert naar clients die bellen op een of meer poorten. Een poort kan een Fixnum poortnummer zijn, een string met een poortnummer, of de naam van een service.

De socket-Module

Om een socket aan te maken, moet u de socket.socket()-functie gebruiken die beschikbaar is in de socket-module, met de algemene syntaxis:

s = socket.socket(socket_family, socket_type, protocol=0)

Beschrijving van de parameters:

  • socket_family - Dit is AF_UNIX of AF_INET, zoals eerder uitgelegd.

  • socket_type - Dit is SOCK_STREAM of SOCK_DGRAM.

  • protocol - Dit wordt meestal weggelaten, standaard 0.

Eenmaal u een socket-object heeft, kunt u de benodigde functies gebruiken om uw client- of serverprogramma te maken. Hieronder volgt de lijst met benodigde functies:

Server Socket Methodes

Nr. Methode & Beschrijving
1

s.bind()

Deze methode bindt het adres (hostname, poortnummer paar) aan de socket.

2

s.listen()

Deze methode stelt een TCP-listener in en start deze.

3

s.accept()

Deze accepteert passief een TCP-clientverbinding, wachtend tot een verbinding aankomt (blokkerend).

Client Socket Methodes

Nr. Methode & Beschrijving
1

s.connect()

Deze methode initieert actief een TCP-serververbinding.

Algemene Socket Methodes

Nr. Methode & Beschrijving
1

s.recv()

Deze methode ontvangt TCP-bericht

2

s.send()

Deze methode verzendt TCP-bericht

3

s.recvfrom()

Deze methode ontvangt UDP-bericht

4

s.sendto()

Deze methode verzendt UDP-bericht

5

s.close()

Deze methode sluit de socket

6

socket.gethostname()

Retourneert de hostname.

Een Eenvoudige Server

Om internet-servers te schrijven, gebruiken we de socket-functie beschikbaar in de socket-module om een socket-object aan te maken. Een socket-object wordt vervolgens gebruikt om andere functies aan te roepen om een socket-server in te stellen.

Roep nu bind(hostname, port) aan om een poort voor uw service op de gegeven host op te geven.

Vervolgens roept u de accept-methode van het geretourneerde object aan. Deze methode wacht tot een client verbindt met de poort die u heeft opgegeven, en retourneert vervolgens een connection-object dat de verbinding met die client vertegenwoordigt.

#!/usr/bin/python
# Dit is server.py bestand
import socket
# Socket-module importeren
s = socket.socket()
# Een socket-object aanmaken
host = socket.gethostname()
# Lokale machinenaam ophalen
port = 12345
# Een poort reserveren voor uw service.
s.bind((host, port))
# Binden aan de poort
s.listen(5)
# Nu wachten op clientverbinding.
while True:
    c, addr = s.accept()
    # Verbinding met client tot stand brengen.
    print 'Got connection from', addr
    c.send('Thank you for connecting')
    c.close()
    # De verbinding sluiten

Een Eenvoudige Client

Laten we een heel simpel clientprogramma schrijven dat een verbinding opent met een gegeven poort 12345 en gegeven host. Het is heel simpel om een socket-client te maken met Python's socket-module functie.

De socket.connect(hostname, port) opent een TCP-verbinding naar hostname op de port. Eenmaal u een open socket heeft, kunt u ervan lezen als van elk IO-object. Wanneer u klaar bent, onthoud om het te sluiten, net zoals u een bestand sluit.

De volgende code is een heel simpele client die verbindt met een gegeven host en poort, alle beschikbare gegevens van de socket leest, en vervolgens afsluit:

#!/usr/bin/python
# Dit is client.py bestand
import socket
# Socket-module importeren
s = socket.socket()
# Een socket-object aanmaken
host = socket.gethostname()
# Lokale machinenaam ophalen
port = 12345
# Een poort reserveren voor uw service.
s.connect((host, port))
print s.recv(1024)
s.close()
# De socket sluiten wanneer klaar

Draai nu deze server.py op de achtergrond en voer daarna bovenstaande client.py uit om het resultaat te zien.

# Het volgende zou een server op de achtergrond starten.
$ python server.py &
# Zodra server gestart is, client als volgt uitvoeren:
$ python client.py

Dit zou het volgende resultaat produceren:

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

Python Internet Modules

Een lijst van enkele belangrijke modules in Python Netwerk/Internet programmeren.

Protocol Algemene functie Poort Nr Python module
HTTP Webpagina's 80 httplib, urllib, xmlrpclib
NNTP Usenet nieuws 119 nntplib
FTP Bestandsoverdrachten 20 ftplib, urllib
SMTP E-mail versturen 25 smtplib
POP3 E-mail ophalen 110 poplib
IMAP4 E-mail ophalen 143 imaplib
Telnet Commandoregels 23 telnetlib
Gopher Documentoverdrachten 70 gopherlib, urllib

Controleer alle bovenstaande bibliotheken om met FTP, SMTP, POP en IMAP protocollen te werken.

Nadere Lezing

Dit was een snelle start met Socket Programmeren. Het is een uitgebreid onderwerp. Het wordt aanbevolen om de volgende links te raadplegen voor meer detail:

  • Unix Socket Programmeren.

  • Python Socket Library and Modules.

Python

  1. Python Datatypes onder de knie krijgen: Een praktische gids
  2. Python Operators onder de knie krijgen: Een uitgebreide gids
  3. Python Pass Statement onder de knie krijgen: Een praktische gids
  4. Python Functie-argumenten onder de knie krijgen: Positionele, Keyword en Default Parameters
  5. Python-dictionaries beheersen: aanmaken, manipuleren en geavanceerde technieken
  6. Python Object-Oriented Programming beheersen: classes, inheritance, encapsulatie & polymorfisme
  7. Python-iterators: hoe ze werken en hoe je je eigen maakt
  8. Python-closures uitgelegd: hoe geneste functies variabelen vangen
  9. Python datetime beheersen: praktische gids voor datums, tijden en tijdzones
  10. Python's time.sleep() onder de knie krijgen: best practices, multithreading en real-world voorbeelden
  11. Python Multithreaded Programmering: Efficiënte Concurrency Technieken