Heim >Backend-Entwicklung >Python-Tutorial >Python-Serverentwicklung – Netzwerkgrundlagen

Python-Serverentwicklung – Netzwerkgrundlagen

高洛峰
高洛峰Original
2016-10-18 10:52:461124Durchsuche

Das Netzwerk ist von unten nach oben in physikalische Schicht, Datenverbindungsschicht, Netzwerkschicht, Transportschicht, Sitzungsschicht, Präsentationsschicht und Anwendungsschicht unterteilt.

HTTP ist ein High-Level-Protokoll, während TCP/IP ein Protokollsatz ist, der viele Unterprotokolle umfasst. Einschließlich: FTP, UDP, TCP-Protokolle auf der Transportschicht, IP-Protokoll auf der Netzwerkschicht usw., Protokolle auf hoher Ebene wie HTTP, Telnet-Protokoll usw. HTTP ist ein Unterprotokoll von TCP/IP.

Socket ist die Kapselung und Anwendung des TCP/IP-Protokolls (auf Programmiererebene). Man kann auch sagen, dass das TPC/IP-Protokoll ein Transportschichtprotokoll ist, das hauptsächlich die Art und Weise löst, wie Daten im Netzwerk übertragen werden, während HTTP ein Anwendungsschichtprotokoll ist, das hauptsächlich die Art und Weise löst, wie Daten verpackt werden.

Wenn wir Daten übertragen, können wir nur das TCP/IP-Protokoll (Transportschicht) verwenden, aber in diesem Fall kann der Dateninhalt ohne die Anwendungsschicht nicht identifiziert werden, wenn Sie die übertragenen Daten erstellen möchten sinnvoll, dann müssen Protokolle der Anwendungsschicht verwendet werden. Es gibt viele Protokolle der Anwendungsschicht, wie z. B. HTTP, FTP, TELNET usw. Sie können auch Ihre eigenen Protokolle der Anwendungsschicht definieren. WEB verwendet das HTTP-Protokoll als Protokoll der Anwendungsschicht, um HTTP-Textinformationen zu kapseln, und verwendet dann TCP/IP als Protokoll der Transportschicht, um sie an das Netzwerk zu senden.

Über welchen Socket sprechen wir normalerweise? Tatsächlich ist Socket selbst kein Protokoll, sondern eine aufrufende Schnittstelle (API). kann das TCP/IP-Protokoll verwenden. Tatsächlich hängt Socket nicht unbedingt mit dem TCP/IP-Protokoll zusammen. Als die Socket-Programmierschnittstelle entworfen wurde, hoffte man, dass sie sich auch an andere Netzwerkprotokolle anpassen lässt. Das Aufkommen von Socket erleichtert Programmierern daher nur die Verwendung des TCP/IP-Protokollstapels. Es handelt sich um eine Abstraktion des TCP/IP-Protokolls und bildet somit einige der grundlegendsten Funktionsschnittstellen, die wir kennen, wie z. B. Erstellen, Abhören, verbinden, akzeptieren, senden, lesen und schreiben usw.

TCP/IP ist nur ein Protokollstapel, genau wie der Betriebsmechanismus des Betriebssystems, er muss konkret implementiert werden und muss auch eine externe Betriebsschnittstelle bereitstellen. So wie das Betriebssystem eine Standardprogrammierschnittstelle bereitstellt, beispielsweise die Win32-Programmierschnittstelle, stellt TCP/IP auch eine Schnittstelle bereit, die Programmierer für die Netzwerkentwicklung verwenden können. Dies ist die Socket-Programmierschnittstelle.

Es gibt eine anschaulichere Beschreibung: HTTP ist ein Auto, das eine bestimmte Form der Kapselung oder Anzeige von Daten bereitstellt; Socket ist eine Engine, die die Fähigkeit zur Netzwerkkommunikation bereitstellt.

Tatsächlich basiert das TCP der Transportschicht auf dem IP-Protokoll der Netzwerkschicht, und das HTTP-Protokoll der Anwendungsschicht basiert auf dem TCP-Protokoll der Transportschicht, Socket selbst jedoch nicht Wie oben erwähnt handelt es sich um ein Protokoll, das lediglich eine Schnittstelle für die TCP- oder UDP-Programmierung bereitstellt.

Schritte zum Herstellen einer Netzwerkverbindung mithilfe von Socket:

Das Herstellen einer Socket-Verbindung erfordert mindestens ein Paar Sockets, von denen einer auf dem Client ausgeführt wird (ClientSocket genannt), und der andere auf dem Client ausgeführt wird Server, genannt ClientSocket für ServerSocket.

Der Verbindungsprozess zwischen Sockets ist in drei Schritte unterteilt: Serverüberwachung, Clientanforderung und Verbindungsbestätigung.

1. Serverüberwachung: Der serverseitige Socket findet den spezifischen Client-Socket nicht, sondern wartet auf eine Verbindung, überwacht den Netzwerkstatus in Echtzeit und wartet auf die Verbindungsanforderung des Clients.

2. Clientanforderung: Bezieht sich auf den Socket des Clients, der eine Verbindungsanforderung stellt, und das zu verbindende Ziel ist der Socket des Servers. Dazu muss der Socket des Clients zunächst den Socket des Servers beschreiben, mit dem er eine Verbindung herstellen möchte, die Adresse und Portnummer des serverseitigen Sockets angeben und dann eine Verbindungsanforderung an den serverseitigen Socket stellen.

3. Verbindungsbestätigung: Wenn der serverseitige Socket eine Verbindungsanforderung vom Client-Socket abhört oder empfängt, antwortet er auf die Client-Socket-Anfrage, richtet einen neuen Thread ein und sendet die Beschreibung des serverseitigen Sockets an den Client Bestätigt der Kunde diese Beschreibung, wird die Verbindung zwischen den beiden Parteien offiziell hergestellt. Der serverseitige Socket befindet sich weiterhin im Überwachungsstatus und empfängt weiterhin Verbindungsanfragen von anderen Client-Sockets.

Eigenschaften von HTTP-Links

Das HTTP-Protokoll ist das Hypertext Transfer Protocol. Es ist die Grundlage der Web-Vernetzung und eines der am häufigsten verwendeten Protokolle für die Mobilfunk-Vernetzung TCP Eine Anwendung auf dem Protokoll.

Das bemerkenswerteste Merkmal von HTTP-Verbindungen ist, dass jede vom Client gesendete Anfrage eine Antwort vom Server zurücksenden muss. Nachdem die Anfrage abgeschlossen ist, wird die Verbindung aktiv freigegeben. Der Vorgang vom Herstellen einer Verbindung bis zum Schließen der Verbindung wird als „Verbindung“ bezeichnet.

Das Internetprotokoll

IP ist eine 32-Bit-Ganzzahl ohne Vorzeichen. Die IP-Adresse wird über die DNS-Datenbank (Domain Name System) dem Domänennamen zugeordnet.

#!/usr/bin/env python
# Foundations of Python Network Programming - Chapter 1 - getname.py
import socket
hostname = 'google.com'
addr = socket.gethostbyname(hostname)
print 'The address of', hostname, 'is', addr
# The address of google.com is 173.194.72.113

Python-Netzwerkprogrammierung:

Python bietet alle Methoden für den Zugriff auf die Socket-Schnittstelle des zugrunde liegenden Betriebssystems. und bietet außerdem eine Reihe von Diensten für verschlüsselte und authentifizierte Kommunikation, SSL/TLS.

Sockets ist eigentlich ein Dateideskriptor, der eine Verbindung zu einer Datei im Netzwerk herstellt.

1. Erstellen Sie eine lokale UDP-Verbindung:

#!/usr/bin/env python
import socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
MAX = 65535
PORT = 1060
if sys.argv[1:] == ['server']:
    s.bind(('127.0.0.1', PORT))
    print 'Listening at', s.getsockname()
    while True:
        data, address = s.recvfrom(MAX)
        print 'The client at', address, 'says', repr(data)             
     s.sendto('Your data was %d bytes' % len(data), address)
elif sys.argv[1:] == ['client']:
        print 'Address before sending:', s.getsockname()
        s.sendto('This is my message', ('127.0.0.1', PORT))
        print 'Address after sending', s.getsockname()
        data, address = s.recvfrom(MAX) # overly promiscuous - see text!
        print 'The server', address, 'says', repr(data)
else:
    print >>sys.stderr, 'usage: udp_local.py server|client'

Führen Sie diesen Code aus:

python filename.py server
#Listening at ('127.0.0.1', 1060)
#Address before sending: ('0.0.0.0', 0)
#Address after sending ('0.0.0.0', 62892)
#The server ('127.0.0.1', 1060) says 'Your data was 18 bytes'
python filename.py client
#The client at ('127.0.0.1', 62892) says 'This is my message'

2. Erstellen Sie eine Remote-Verbindung und überprüfen Sie die empfangenen Informationen :

import random, socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
MAX = 65535
PORT = 1060
if 2 <= len(sys.argv) <= 3 and sys.argv[1] == &#39;server&#39;:
    interface = sys.argv[2] if len(sys.argv) > 2 else &#39;&#39;
    s.bind((interface, PORT))
    print &#39;Listening at&#39;, s.getsockname()
    while True:
        data, address = s.recvfrom(MAX)
        if random.randint(0, 1):
            print &#39;The client at&#39;, address, &#39;says:&#39;, repr(data)
            s.sendto(&#39;Your data was %d bytes&#39; % len(data), address)
        else:
            print &#39;Pretending to drop packet from&#39;, address
elif len(sys.argv) == 3 and sys.argv[1] == &#39;client&#39;:
    hostname = sys.argv[2]
    s.connect((hostname, PORT))
    print &#39;Client socket name is&#39;, s.getsockname()
    delay = 0.1
    while True:
        s.send(&#39;This is another message&#39;)
        print &#39;Waiting up to&#39;, delay, &#39;seconds for a reply&#39;
        s.settimeout(delay)
        try:
            data = s.recv(MAX)
        except socket.timeout:
            delay *= 2  # wait even longer for the next request
            if delay > 2.0:
                raise RuntimeError(&#39;I think the server is down&#39;)
        else:
            break   # we are done, and can stop looping
              
    print &#39;The server says&#39;, repr(data)
else:
    print >>sys.stderr, &#39;usage: udp_remote.py server [ <interface> ]&#39;
    print >>sys.stderr, &#39;   or: udp_remote.py client <host>&#39;
    sys.exit(2)

这里的s.connect((hostname, PORT))方法,可以让我们不用每次都调用s.sendto('This is my message', ('127.0.0.1', PORT))。直接调用

s.send('This is another message')。


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn