Heim  >  Artikel  >  Backend-Entwicklung  >  Häufig verwendete Funktionen bei der PHP-Socket-Programmierung und der Implementierung einfacher C/S-Interaktion

Häufig verwendete Funktionen bei der PHP-Socket-Programmierung und der Implementierung einfacher C/S-Interaktion

不言
不言Original
2018-07-26 10:18:251624Durchsuche

Der Inhalt dieses Artikels befasst sich mit häufig verwendeten Funktionen in der PHP-Socket-Programmierung und der Implementierung einfacher C/S-Interaktionen. Ich hoffe, dass er Ihnen helfen kann.

Socket-Einführung

Offizielle Erklärung von Socket:
Die am häufigsten verwendete Lösung in der Netzwerkprogrammierung ist das Client/Server-Modell (Client/Server). In diesem Szenario fordert die Clientanwendung Dienste vom Serverprogramm an. Ein Dienstprogramm wartet normalerweise auf Anfragen für den Dienst an einer bekannten Adresse. Das heißt, der Dienstprozess bleibt inaktiv, bis ein Client eine Verbindungsanfrage an die Adresse des Dienstes stellt. In diesem Moment ist das Serviceprogramm „erwacht“ und stellt dem Client Services zur Verfügung – und reagiert dabei angemessen auf die Anfrage des Clients. Um die Netzwerkprogrammierung dieses Client/Server-Modells zu erleichtern, entwickelten Microsoft und mehrere andere Unternehmen Anfang der 1990er Jahre gemeinsam eine Reihe von Netzwerkprogrammierschnittstellen unter WINDOWS, nämlich die Windows Sockets-Spezifikation. Dabei handelt es sich nicht um ein Netzwerkprotokoll, sondern um ein Netzwerk Programmierschnittstelle Eine Reihe offener Netzwerkprogrammierschnittstellen unter Windows, die mehrere Protokolle unterstützen. Jetzt ist Winsock grundsätzlich protokollunabhängig. Sie können Winsock zum Aufrufen von Funktionen mehrerer Protokolle verwenden, das TCP/IP-Protokoll wird jedoch häufiger verwendet. Socket stellt tatsächlich einen Kommunikationsanschluss im Computer bereit, über den er mit jedem Computer kommunizieren kann, der über eine Socket-Schnittstelle verfügt. Anwendungen übertragen im Netzwerk und empfangen Informationen über diese Socket-Schnittstelle.

Wir können Socket einfach als eine Pipe verstehen, die verschiedene Computeranwendungen im Netzwerk verbinden und eine Menge Daten vom A-Ende der Pipe übertragen kann Wenn es hineingeworfen wird, kommt es am B-Ende des Rohrs heraus (es kann auch an den Enden C, D, E, F... herauskommen).

注意: Wir werden unterschiedliche Wörter verwenden, um Socket in verschiedenen Kontexten zu modifizieren. Sie müssen nur eine Vorstellung davon haben, da Socket selbst keine echte Entität hat

Socket-Funktion Einführung

Die Socket-Kommunikation durchläuft mehrere Phasen: Socket-Erstellung, Socket-Bindung, Socket-Überwachung, Socket-Senden und -Empfangen und Socket-Schließen. Nachfolgend listen wir die Schritte in der PHP-Netzwerkprogrammierung auf. Einige häufig verwendete Funktionen werden am häufigsten verwendet und sind im Folgenden näher erläutert.

socket_create

TODO: Erstellen Sie eine neue Socket-Ressource
Funktionsprototyp: resource socket_create ( int $domain , int $type , int $protocol )
Es enthält drei Parameter wie folgt:

  • Domäne: AF_INET, AF_INET6, AF_UNIX, AF bedeutet address family, was bedeutet, dass wir häufig IPv4, IPv6

  • Typ: SOCK_STREAM, SOCK_DGRAM usw. verwenden. Das am häufigsten verwendete ist SOCK_STREAM, der auf dem Byte-Stream basierende SOCKET-Typ, der auch vom TCP-Protokoll verwendet wird.

  • Protokoll: SOL_TCP, SOL_UDP Dies ist das spezifische Übertragungsprotokoll Für die allgemeine zuverlässige Übertragung wählen wir TCP und für die Übertragung von Spieldaten im Allgemeinen das UDP-Protokoll

socket_bind

TODO: Binden Sie die erstellte Socket-Ressource an a spezifische IP-Adresse und Port
Funktionsprototyp: bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )

Es enthält drei Parameter wie folgt:

  • Socket: Die Socket-Ressource, die mit socket_create erstellt wurde kann berücksichtigt werden Es ist die ID, die dem Socket entspricht

  • Adresse: IP-Adresse

  • Port: Die Nummer des Abhörports, der Standardport von der WEB-Server ist 80

socket_listen

TODO: Überwachen Sie die Sende- und Empfangsvorgänge von Socket-Ressourcen an einer bestimmten Adresse
Funktionsprototyp: bool socket_listen ( resource $socket [, int $backlog = 0 ] )

Es enthält jeweils zwei Parameter wie folgt:

  • Socket: Socket-Ressource erstellt mit socket_create

  • Backlog: maximale Länge der Warteschlange, die auf die Verarbeitung wartet

socket_accept

TODO: Nach dem Abhören eine bevorstehende neue Verbindung empfangen. Wenn die Verbindung erfolgreich hergestellt wurde, wird ein neues Socket-Handle erstellt zurückgegeben (Sie können es als untergeordneten Prozess verstehen, normalerweise als übergeordneter Prozess. Der Prozess wird verwendet, um neue Verbindungen zu empfangen, und der untergeordnete Prozess ist für die spezifische Kommunikation verantwortlich.)
Funktionsprototyp: resource socket_accept ( resource $socket )

  • Socket: Socket-Ressource erstellt mit socket_create

socket_write

TODO: Die angegebenen Daten an die entsprechende Socket-Pipe senden
Funktionsprototyp: int socket_write ( resource $socket , string $buffer [, int $length ] )

  • Socket: Socket-Ressource erstellt mit socket_create

  • Puffer: In die socket-Ressource

  • Länge: Steuern Sie das Schreiben in die Länge von

    in der Ressource socket. Wenn die Länge größer als die Kapazität von buffer ist, wird die Kapazität von buffer als buffer angenommen

socket_read

TODO: Die übertragenen Daten abrufen
Funktionsprototyp: int socket_read ( resource $socket ,  int $length )

  • socket: Erstellt mit socket_create Die Länge der Socket-Ressource

  • length: Die Länge der socket in der buffer-Ressource

socket_close

TODO: Socket-Ressource schließen
Funktionsprototyp: void socket_close ( resource $socket )

  • Socket: Die von socket_accept oder socket_create generierte Ressource kann nicht zum Schließen des stream verwendet werden Ressource

stream_socket_server

Da der Prozess der Erstellung eines SOCKETs immer aus Socket, Bindung und Abhören besteht, bietet PHP eine sehr praktische Funktion zum Erstellen, Binden und Abhören von Ports an Ports auf einmal

Funktionsprototyp: resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )

  • local_socket: Protokollname://Adresse:Portnummer

  • errno: Fehlercode

  • errstr: Fehlermeldung

  • Flags: Nur einen Teil der Funktion verwenden

  • Kontext: Verwenden Sie stream_context_createDer von der Funktion erstellte Ressourcenflusskontext

Socket implementiert die C/S-Interaktion

Basierend auf Mit der obigen Funktion können wir problemlos ein Socket-Kommunikationsprogramm erstellen (hier hoffe ich, dass Leser ein separates Verzeichnis wie socket erstellen können, da wir später viele Dateien erstellen werden). Zuerst bearbeiten wir ein Serverprogramm server.php wie folgt:

<?php date_default_timezone_set("Asia/Shanghai");
error_reporting(E_NOTICE );

/*  确保在连接客户端时不会超时   */
set_time_limit(0);

$ip = &#39;127.0.0.1&#39;;
$port = 8090;

/*
 +-------------------------------
 *    @socket通信整个过程
 +-------------------------------
 *    @socket_create
 *    @socket_bind      
 *    @socket_listen
 *    @socket_accept
 *    @socket_read
 *    @socket_write
 *    @socket_close
 +--------------------------------
 */

/*----------------    以下操作都是手册上的    -------------------*/
if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
    echo "socket_create() Why failure is:".socket_strerror($sock)."\n";
}

if(($ret = socket_bind($sock,$ip,$port)) < 0) {
    echo "socket_bind() Why failure is:".socket_strerror($ret)."\n";
}

if(($ret = socket_listen($sock,4)) < 0) {
    echo "socket_listen() Why failure is:".socket_strerror($ret)."\n";
}

echo "Start time:".date(&#39;Y-m-d H:i:s&#39;) . PHP_EOL;
echo "Listening at ".$ip.&#39;:&#39;.$port.PHP_EOL;


do {
    /*  创建新的连接  */
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
        break;
    } else {
        
    # 连接成功输出 Socket id
    $i = (int)$msgsock;
    echo "welcome client $i";

        # 向客户端通信(反馈)
        $msg ="连接成功!\n";
        socket_write($msgsock, $msg, strlen($msg));
    }
    socket_close($msgsock);
} while (true);
socket_close($sock);
?>

und dann ein anderes bearbeiten. Das Client-Programm client.php lautet wie folgt:

<?php set_time_limit(0);
$port = 8090;
$ip = "127.0.0.1";

/*
 +-------------------------------
 *    客户端 socket 连接整个过程
 +-------------------------------
 *    @socket_create
 *    @socket_connect
 *    @socket_write
 *    @socket_read
 *    @socket_close
 +--------------------------------
 */


/**
 * @socket_connect:客户端发起套接字连接
 * @param socket  resource $socket       创建的$socket资源
 * @param address string   SOCK_STREAM   IP地址|Unix套接字
 * @param port    int                    端口
 */

/**
 * @socket_create:创建并返回一个套接字
 * @param domain   string AF_INET         IPV4 网络协议
 * @param type     string SOCK_STREAM     全双工字节流(可用的套接字类型)
 * @param protocol string SOL_TCP         具体协议(IPV4下的TCP协议)
 * @param return   套接字
 */

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
    echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
}else {
    echo "try to connect &#39;$ip&#39; port: &#39;$port&#39;...\n";
}


$result = socket_connect($socket, $ip, $port);  #socket_connect的返回值应该是boolean值
if ($result < 0) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}else {
    # 连接成功输出提示信息
    echo "connect successfully\n";

    # 向服务端发送数据
    socket_write($socket, " hello ", 1024);

    # 获取服务端数据
    $result = socket_read($socket, 1024);
    echo "服务器回传数据为:" . $result;


    echo "CLOSE SOCKET...\n";
    socket_close($socket);
    echo "CLOSE OK\n";    
    
}



?>

Dann öffnen wir das Terminal (Befehlszeile) und geben das Dateiverzeichnis ein, um es nacheinander auszuführen:

php server.php
php client.php

Der laufende Effekt ist wie folgt:

Häufig verwendete Funktionen bei der PHP-Socket-Programmierung und der Implementierung einfacher C/S-Interaktion

注意Wenn der Server lauscht, wird der Prozess angehalten und es können keine anderen Vorgänge ausgeführt werden. Möglicherweise müssen Sie ein anderes Terminal starten, um das Client-Programm auszuführen

Verwandte Empfehlungen:

Wie implementieren PHP und MySql das Lesen von Hintergrunddaten (Code)

Thinkphp5 verwendet den Worker-Timer, um den Inhaltscode der Website regelmäßig zu crawlen

Das obige ist der detaillierte Inhalt vonHäufig verwendete Funktionen bei der PHP-Socket-Programmierung und der Implementierung einfacher C/S-Interaktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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