Heim Backend-Entwicklung PHP-Tutorial Schreiben Sie grundlegende Socket-Programme in PHP

Schreiben Sie grundlegende Socket-Programme in PHP

Nov 18, 2019 pm 02:11 PM
php

Junge Leute warnen

Persönliche Fähigkeiten sind nutzlos, wenn man jeden Tag hart arbeitet, anstatt in einem Schritt den Himmel zu erreichen. Eines Tages wird jeder Tropfen Wasser in den Stein eindringen. Es wird dunkel sein und die Blumen werden hell sein.

Mein Zweck

Weil ich in meinem zukünftigen Studium möglicherweise Netzwerkinhalte verwende, aber gleichzeitig haben viele Programmierer, die PHP schreiben, noch nie ein Sockets-Programm geschrieben, aber Ich muss davon gehört haben, und ich muss vom Wort Netzwerkprogrammierung gehört haben, daher habe ich vor, das relevante Wissen hier kurz zu erläutern. Dieser Blog-Beitrag enthält ein Beispielprogramm, und der Code wird auf Code Cloud gehostet (php-socket-base-code: https://gitee.com/obamajs/php-socket-base-code), Sie müssen es nur herunterladen, die entsprechende Umgebung konfigurieren und den Anweisungen zum Ausführen folgen.

Umgebungskonfiguration

Socket-Programmierung muss die Socket-Erweiterung von PHP aktivieren, daher müssen Sie hier nur die Datei php.ini öffnen und finden Sie diese Zeile. Entfernen Sie einfach die Kommentare

extension=sockets
Nach dem Login kopieren

Offizielles Dokument

Die offizielle Adresse der PHP-Socket-Programmierung lautet: PHP-Socket (https://www.php.net /manual/ en/book.sockets.php)

Serverseitige Programmierung

Die Socket-Programmierung erfolgt nach bestimmten Programmierschritten anders, schauen wir uns zuerst den Server an.

Schreiben Sie grundlegende Socket-Programme in PHP

Socket erstellen

Sockets sind Systemressourcen. Wir rufen zunächst die Methode socket_create auf (siehe offizielle Dokumentation: https: / /www.php.net/manual/en/function.socket-create.php), der Aufruf lautet wie folgt:

$this->socket_handle = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$this->socket_handle) {
      //创建失败抛出异常,socket_last_error获取最后一次socket操作错误码,socket_strerror打印出对应错误码所对应的可读性描述
     throw new Exception(socket_strerror(socket_last_error($this->socket_handle)));
} else {
          echo "create socket successful\n";
}
Nach dem Login kopieren

Der erste Parameter gibt an, ob der aktuelle Socket IPv4 oder IPv6 verwendet, wenn ja. Wenn ja Ersteres ist der Fall, dann übergeben Sie AF_INET, andernfalls gibt es natürlich einen anderen Typ, nämlich AF_UNIX. Dies wird im Allgemeinen nicht besprochen (IPv6 ist nicht sehr beliebt).

Der zweite Parameter gibt den Protokolltyp an. Im Allgemeinen ist TCP oder UDP eine zuverlässige Streaming-Übertragung (die am weitesten verbreitete im Leben, die Zuverlässigkeit und Sicherheit gewährleistet), während dies bei UDP nicht der Fall ist Wählt im Allgemeinen TCP aus.

Der dritte ist SOL_TCP, wenn Sie zuvor TCP ausgewählt haben, andernfalls ist es SOL_UDP.

Bindeadresse und Portnummer

Da ein Host möglicherweise mehrere IP-Adressen hat, müssen Sie angeben, auf welche Ihr Socket lauscht. Der häufig verwendete Wert ist 127,0 .0.1 oder alle Adressen abhören 0.0.0.0 Also versteht jemand hier möglicherweise nicht, was der Unterschied zwischen 127.0.0.1 und 0.0.0.0 ist. 127.0.0.1 ist nur eine Loopback-Adresse und kann nur für den lokalen Zugriff verwendet werden. Da diese IP nicht für die Außenwelt offen ist, kann niemand auf diese Adresse zugreifen, wenn Ihr Server Adresse ist auf 127.0.0 eingestellt, wenn andere zugreifen wollen, können sie nur scheiße gehen.

0.0.0.0 ist nicht unbedingt eine IP-Adresse. Das bedeutet, dass alle IP-Adressen dieser Maschine mir gehören, haha.

Das Obige verstanden, schauen wir uns den Aufrufcode an

if (!socket_bind($this->socket_handle, $this->addr, $this->port)) {
         throw new Exception(socket_strerror(socket_last_error($this->socket_handle)));
    } else {
         echo "bind addr successful\n";
 }
Nach dem Login kopieren

Ist es sehr einfach? Der erste Parameter ist das von socket_create zurückgegebene Ergebnis und der zweite Parameter ist die Adresse Wie bereits erwähnt, ist der dritte Parameter die Portnummer.

Listening-Socket

Nach den obigen Schritten haben wir einfach einen Socket erstellt und die Portnummer und Adresse daran gebunden, aber was ist mit dem System? eine Hörsteckdose? Unsere Arbeit ist also noch nicht getan, also müssen wir es erzählen. Sagen Sie mir nicht, dass Sie in einer guten Beziehung zum System stehen! ! !

if (!socket_listen($this->socket_handle, $this->back_log)) {
      throw new Exception(socket_strerror(socket_last_error($this->socket_handle)));
  } else {
      echo "socket  listen successful\n";
 }
Nach dem Login kopieren

Der zweite Parameter ist es wert, mir im Detail zuzuhören. Für jeden Prozess im Linux-System verwaltet das System eine Warteschlange ausstehender Sockets (First In, First Out). Es gilt das Prinzip „Wer zuerst kommt, mahlt zuerst“). Es dauert einige Zeit, bis das übergeordnete Programm die Geschäftslogik verarbeitet. Warten Sie also einfach. Auf welche Größe ist diese Warteschlange eingestellt? Sein Wert ist der zweite Parameter. Kann ich ihn also auf einen großen Wert einstellen? Saonian, denkst du zu viel nach? Dieser Wert ist in verschiedenen Systemen unterschiedlich. Sagen Sie nicht, dass ich Sie täusche.

The maximum number passed to the backlog parameter highly depends on the underlying platform. On Linux, it is silently truncated to SOMAXCONN. On win32, if passed SOMAXCONN, the underlying service provider responsible for the socket will set the backlog to a maximum reasonable value. There is no standard provision to find out the actual backlog value on this platform.
Nach dem Login kopieren

Sie müssen sich nicht um die genauen Daten dieses Werts kümmern, sie sind bedeutungslos.

Alles ist bereit, alles was wir brauchen ist der Ostwind

Nach dem oben genannten Vorgang können wir beginnen, Verbindungen vom Client zu akzeptieren, und diese Funktion ist noch einfacher

$client_socket_handle = socket_accept($this->socket_handle);
Nach dem Login kopieren

Der Rückgabewert dieser Funktion ist auch ein Socket-Handle, sodass Sie ihn lesen und schreiben können. Im aktuellen Beispielprogramm ist das, was wir tun, sehr einfach, so einfach, dass Sie an Ihrem Leben zweifeln können.

 $client_socket_handle = socket_accept($this->socket_handle);
        if (!$client_socket_handle) {
            echo "socket_accept call failed\n";
            exit(1);
        } else {
            while (true) {
                $bytes_num = socket_recv($client_socket_handle, $buffer, 100, 0);
                if (!$bytes_num) {
                    echo "socket_recv  failed\n";
                    exit(1);
                } else {
                    echo "content from client:" . $buffer . "\n";
                }
            }
        }
Nach dem Login kopieren

Socket lesen

Am Beispiel des obigen Beispiels verwenden wir socket_recv, um den Inhalt vom Client zu lesen. Der Funktionsprototyp ist wie folgt

socket_recv ( resource $socket , string &$buf , int $len , int $flags ) : int
Nach dem Login kopieren

Der gelesene Inhalt wird im zweiten Parameter zurückgegeben. Der zweite Parameter übergibt die Anzahl der Zeichen, die wir lesen möchten. Der vierte Parameter kann direkt auf 0 gesetzt werden. Der Rückgabewert dieser Funktion ist der tatsächlich gelesene Wert. Die Anzahl der genommenen Bytes.

Client-Programmierung

客户端相对于服务端来说,就很简单了,流程如下

Schreiben Sie grundlegende Socket-Programme in PHP

创建套接字前面已经讲过了,不再详述,客户端只需要连接服务器即可,函数为 socket_create,我们来看一哈在当前的例子中,我们是如何调用的。

if (!socket_connect($this->socket_handle, $this->server_addr, $this->server_port)) {
            echo socket_strerror(socket_last_error($this->socket_handle)) . "\n";
            exit(1);
        } else {
            while (true) {
                $data = fgets(STDIN);
                //如果用户输入quit,那么退出程序
                if (strcmp($data, "quit") == 0) {
                    break;
                }
                socket_write($this->socket_handle, $data);
            }
        }
Nach dem Login kopieren

该函数只需要指定服务器的地址和端口号即可,参数是不是很简单

练习实例

在讲解基本函数调用的时候,我就把自带程序的核心部分,复制出来了,如果要完整的程序,这里是地址(php-socket-base-code:https://gitee.com/obamajs/php-socket-base-code),代码非常简单,再次提醒,这些代码完全是用于给大家讲解基本的 socket 变成操作,为大家以后的学习打下基础,那么如何使用这个例子程序呢?

进入到命令行,开启服务器程序

php TcpServer.php,

打开另外一个命令行界面,

php TcpClient.php,

在客户端界面,输入任何文本,再输入回车,再切换到服务器界面,您将会看到客户端输入的内容

在笔者的电脑上操作实例截图如下:

Schreiben Sie grundlegende Socket-Programme in PHP

Das obige ist der detaillierte Inhalt vonSchreiben Sie grundlegende Socket-Programme in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

7 PHP-Funktionen, die ich leider vorher nicht kannte 7 PHP-Funktionen, die ich leider vorher nicht kannte Nov 13, 2024 am 09:42 AM

Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

See all articles