Heim  >  Artikel  >  Backend-Entwicklung  >  Wie man den PHP-Socket versteht

Wie man den PHP-Socket versteht

王林
王林nach vorne
2020-01-23 19:01:463102Durchsuche

Wie man den PHP-Socket versteht

Was ist eine Steckdose?

Socket ist eine Abstraktionsschicht zwischen der Anwendungsschicht und der Transportschicht. Es abstrahiert die komplexen Vorgänge der TCP/IP-Schicht in mehrere einfache Schnittstellen, damit die Anwendungsschicht den Implementierungsprozess im Netzwerk aufrufen kann . Kommunikation. Socket stammt aus UNIX. Unter der UNIX-Idee, dass alles eine Datei ist, wird die Kommunikation zwischen Prozessen als Dateideskriptor bezeichnet. Jeder Client verwaltet eine Datei ". Nachdem die Verbindung hergestellt und geöffnet wurde, können Inhalte in die Datei geschrieben werden, damit die andere Partei sie lesen kann, oder der Inhalt der anderen Partei kann gelesen werden. Die Datei wird geschlossen, wenn die Kommunikation endet.

Das Bild zeigt die Position des Sockets:

Wie man den PHP-Socket versteht

Socket-Kommunikationsprozess

Socket sorgt für die Kommunikation zwischen Kommunikation verschiedener Computer, also Netzwerkkommunikation. Bei Websites ist das Kommunikationsmodell die Kommunikation zwischen dem Server und dem Client. An beiden Enden wird ein Socket-Objekt eingerichtet, und dann werden Daten über das Socket-Objekt übertragen. Normalerweise befindet sich der Server in einer Endlosschleife und wartet darauf, dass der Client eine Verbindung herstellt.

Weitergabe verwandter Lernvideo-Tutorials: PHP-Video-Tutorial

Das folgende Bild ist ein verbindungsorientiertes TCP-Zeitdiagramm:

Wie man den PHP-Socket versteht

Client-Prozess:

Der Client-Prozess ist relativ einfach: Erstellen Sie einen Socket, stellen Sie eine Verbindung zum Server her und verbinden Sie den Socket mit dem Remote-Host (Hinweis: Nur TCP verfügt über die Konzept der „Verbindung“, einige Sockets wie UDP, ICMP und ARP verfügen nicht über das Konzept der „Verbindung“), Daten senden, Antwortdaten lesen, bis der Datenaustausch abgeschlossen ist, die Verbindung schließen und die TCP-Konversation beenden.

Wie man den PHP-Socket versteht

Die send()-Methode ist auch hier verfügbar: Der Unterschied besteht darin, dass sendall() vor der Rückgabe versucht, alle Daten zu senden, und bei Erfolg None zurückgibt, während send( ) gibt send die Anzahl der Bytes zurück, bei einem Fehler wird eine Ausnahme ausgelöst.

Serverprozess:

Lassen Sie uns über den Serverprozess sprechen, zunächst den Socket initialisieren, einen Streaming-Socket einrichten und mit der lokalen Adresse und dem Port Bind kommunizieren , benachrichtigen Sie dann TCP, dass es bereit ist, Verbindungen zu empfangen, rufen Sie Accept() zum Blockieren auf und warten Sie auf eine Verbindung vom Client. Wenn der Client zu diesem Zeitpunkt eine Verbindung mit dem Server herstellt, sendet der Client eine Datenanforderung, der Server empfängt die Anforderung und verarbeitet die Anforderung, sendet dann die Antwortdaten an den Client und der Client liest die Daten bis zum Datenaustausch ist abgeschlossen. Abschließend wird die Verbindung geschlossen und die Interaktion beendet.

Wie man den PHP-Socket versteht

Wenn Accept() aufgerufen wird, wechselt der Socket in den Wartezustand. Wenn der Client eine Verbindung anfordert, stellt die Methode die Verbindung her und kehrt zum Server zurück. Accept() gibt ein Tupel mit zwei Elementen (conn, addr) zurück. Das erste Element conn ist das neue Socket-Objekt, über das der Server mit dem Client kommunizieren muss; das zweite Element addr ist die IP-Adresse und der Port des Clients. data = conn.recv(1024)

Der nächste Schritt ist die Verarbeitungsphase, in der Server und Client über send() und recv() kommunizieren (Daten übertragen).

Der Server ruft send() auf und sendet Informationen in Form einer Zeichenfolge an den Client. send() gibt die Anzahl der gesendeten Zeichen zurück.

Der Server ruft recv() auf, um Informationen vom Client zu erhalten. Beim Aufruf von recv() muss der Server eine Ganzzahl angeben, die der maximalen Datenmenge entspricht, die mit diesem Methodenaufruf empfangen werden kann. recv() wechselt beim Empfang von Daten in den blockierten Zustand und gibt schließlich eine Zeichenfolge zurück, die die empfangenen Daten darstellt. Wenn die Menge der gesendeten Daten die zulässige Menge von recv() überschreitet, werden die Daten gekürzt. Die überschüssigen Daten werden auf der Empfangsseite zwischengespeichert. Wenn recv() in Zukunft aufgerufen wird, werden die verbleibenden Bytes weiterhin ausgelesen. Wenn überschüssige Daten vorhanden sind, werden diese aus dem Puffer gelöscht (ebenso wie der Client). (die seit dem letzten recv()-Aufruf gesendet wurden). Wenn die Übertragung abgeschlossen ist, ruft der Server die Funktion close() von Socket auf, um die Verbindung zu schließen.

Betrachten Sie den Socket-Prozess aus der Perspektive der TCP-Verbindung:

Der Socket-Prozess des TCP-Drei-Wege-Handshakes:

Wie man den PHP-Socket versteht

1. Nachdem der Server socket(), bind() und listen() aufgerufen hat, ruft er Accept() auf, um zu blockieren und zu warten.

2. Das Client-Socket-Objekt ruft connect auf () und sendet einen SYN und eine Blockierung;

3 Der Server führt den ersten Handshake durch, d server, connect() Zurückgeben und eine weitere ACK an den Server senden;

5 Das Server-Socket-Objekt empfängt die dritte Handshake-ACK-Bestätigung. Zu diesem Zeitpunkt kehrt der Server von Accept() zurück, um die Verbindung herzustellen.

Der nächste Schritt besteht darin, dass die Verbindungsobjekte an beiden Enden untereinander Daten senden und empfangen.

TCP-Socket-Prozess mit vier Wellen:

Wie man den PHP-Socket versteht1. Ein Anwendungsprozess ruft close() auf, um aktiv zu schließen und eine FIN zu senden; >2. Nachdem das andere Ende die FIN empfangen hat, schließt es passiv den Socket und sendet eine ACK-Bestätigung

3 Anschließend ruft der Anwendungsprozess, der das Herunterfahren passiv ausführt, close() auf, um den Socket zu schließen sendet ein FIN;

4. Das Ende, das dieses FIN empfängt, bestätigt es mit ACK vom anderen Ende.

Zusammenfassung:

Der obige Code zeigt lediglich die Verwendung der Grundfunktionen von Socket. Unabhängig davon, wie komplex das Netzwerkprogramm ist, werden diese Grundfunktionen verwendet. Der obige Servercode verarbeitet nur eine Clientanforderung, bevor er die nächste Clientanforderung verarbeitet. In der Praxis müssen Server über gleichzeitige Verarbeitungsfunktionen verfügen. Ein neuer Prozess oder Thread bearbeitet die Anfrage.

Empfohlene verwandte Artikel und Tutorials:

PHP-Tutorial

Das obige ist der detaillierte Inhalt vonWie man den PHP-Socket versteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen