Fonctions couramment utilisées dans la programmation de socket php et la mise en œuvre d'une simple interaction c/s

不言
Libérer: 2023-04-03 12:40:02
original
1584 Les gens l'ont consulté

Le contenu de cet article concerne les fonctions couramment utilisées dans la programmation de socket php et la mise en œuvre d'une simple interaction c/s. Le contenu est très détaillé. Les amis dans le besoin peuvent s'y référer.

Introduction à Socket

Explication officielle de Socket :
La solution la plus couramment utilisée en programmation réseau est le modèle Client/Serveur (client/serveur). Dans ce scénario, l'application client demande des services au programme serveur. Un programme de service écoute généralement les demandes de service à une adresse connue, c'est-à-dire que le processus de service reste inactif jusqu'à ce qu'un client fasse une demande de connexion à l'adresse du service. A ce moment, le programme de service est « réveillé » et fournit des services au client – ​​réagissant de manière appropriée à la demande du client. Afin de faciliter la programmation réseau de ce modèle Client/Serveur, au début des années 1990, Microsoft et plusieurs autres sociétés ont développé conjointement un ensemble d'interfaces de programmation réseau sous WINDOWS, à savoir la spécification Windows Sockets. Il ne s'agit pas d'un protocole réseau, mais d'un réseau. interface de programmation. Un ensemble d'interfaces de programmation réseau ouvertes sous Windows qui prennent en charge plusieurs protocoles. Désormais, Winsock est devenu fondamentalement indépendant du protocole. Vous pouvez utiliser Winsock pour appeler des fonctions de plusieurs protocoles, mais le protocole TCP/IP est plus couramment utilisé. Socket fournit en fait un port de communication dans l’ordinateur via lequel il peut communiquer avec n’importe quel ordinateur doté d’une interface Socket. Les applications transmettent sur le réseau et reçoivent des informations via cette interface Socket

Nous pouvons simplement comprendre Socket comme un canal qui peut connecter différentes applications informatiques sur le réseau, transférant un tas de données depuis Si l'extrémité A du canal est jeté, il sortira par l'extrémité B du tuyau (il peut aussi sortir par les extrémités C, D, E, F...).

注意 : Nous utiliserons différents mots pour modifier le socket dans différents contextes. Il vous suffit d'en avoir une idée, car le socket lui-même n'a pas d'entité réelle

Fonction Socket. introduction

La communication par socket se déroulera en plusieurs étapes : création de socket, liaison de socket, surveillance de socket, envoi et réception de socket et fermeture de socket. Ci-dessous, nous répertorions les étapes de la programmation réseau PHP Plusieurs fonctions couramment utilisées. sont les plus couramment utilisés et les éléments essentiels sont expliqués plus en détail.

socket_create

TODO : Créer une nouvelle ressource socket
Prototype de fonction : resource socket_create ( int $domain , int $type , int $protocol )
Il contient trois paramètres, comme suit :

  • domaine : AF_INET, AF_INET6, AF_UNIX, la signification de AF est address family, ce qui signifie famille d'adresses. Nous utilisons couramment ipv4, ipv6

  • type : SOCK_STREAM, SOCK_DGRAM, etc., le plus couramment utilisé est SOCK_STREAM, le type SOCKET basé sur le flux d'octets, qui est également le type utilisé par le protocole TCP

  • protocole : SOL_TCP, SOL_UDP C'est le protocole de transmission spécifique utilisé. Pour une transmission générale fiable, nous choisissons TCP, et pour la transmission des données de jeu, nous choisissons généralement le protocole UDP

socket_bind

TODO : lier le socket créé. ressource vers une adresse IP et un port spécifiques
prototype de fonction : bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )

Il contient trois paramètres, comme suit :

  • socket : La ressource socket créée à l'aide socket_create peut être considéré C'est l'identifiant correspondant au socket

  • adresse : adresse ip

  • port : le numéro du port d'écoute, le le port par défaut du serveur WEB est 80

socket_listen

TODO : Surveiller les opérations d'envoi et de réception des ressources socket à une adresse précise
Prototype de fonction : bool socket_listen ( resource $socket [, int $backlog = 0 ] )

Il contient deux paramètres, respectivement comme suit :

  • socket : ressource de socket créée à l'aide de socket_create

  • backlog : longueur maximale de la file d'attente en attente de traitement

socket_accept

TODO : Après écoute, recevoir une nouvelle connexion à venir Si la connexion est établie avec succès, une nouvelle socket. handle sera renvoyé (vous pouvez le comprendre comme un processus enfant, généralement le parent. Le processus est utilisé pour recevoir de nouvelles connexions et le processus enfant est responsable d'une communication spécifique)
Prototype de fonction : resource socket_accept ( resource $socket )

  • socket : ressource de socket créée à l'aide de socket_create

socket_write

TODO : envoyer les données spécifiées au tube de socket correspondant
Fonction prototype : int socket_write ( resource $socket , string $buffer [, int $length ] )

  • socket : ressource de socket créée à l'aide de socket_create

  • buffer : données écrites dans la socket ressource

  • longueur : Contrôle l'écriture dans La longueur de socket dans la ressource buffer Si la longueur est supérieure à la capacité de buffer, la capacité de buffer est prise comme.

socket_read

TODO : Récupérer les données transmises
Prototype de fonction : int socket_read ( resource $socket ,  int $length )

  • socket : Créé à l'aide de socket_create La longueur de la ressource socket

  • length : La longueur du socket dans la ressource buffer

socket_close

TODO : Fermer la ressource socket
prototype de fonction : void socket_close ( resource $socket )

  • socket : La ressource générée par socket_accept ou socket_create ne peut pas être utilisée pour fermer le stream ressource

stream_socket_server

Étant donné que le processus de création d'un SOCKET consiste toujours à socket, lier et écouter, PHP fournit une fonction très pratique pour créer, lier des ports et écouter aux ports à la fois

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

  • local_socket : nom du protocole://adresse:numéro de port

  • errno : code d'erreur

  • errstr : message d'erreur

  • flags : n'utiliser qu'une partie de la fonction

  • Contexte : Utiliser stream_context_createLe contexte de flux de ressources créé par la fonction

le socket implémente l'interaction C/S

Basé sur le ci-dessus, nous pouvons facilement le construire Programme de communication Socket (ici, j'espère que les lecteurs pourront créer un répertoire séparé tel que socket car nous créerons beaucoup de fichiers plus tard. Nous éditons d'abord un programme serveur server.php comme suit :

<?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);
?>
Copier après la connexion

puis Editer un programme client client.php comme suit :

<?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";    
    
}



?>
Copier après la connexion

Ensuite, nous ouvrons le terminal (ligne de commande) et entrons dans le répertoire du fichier à exécuter en séquence :

php server.php
php client.php
Copier après la connexion

L'effet d'exécution est le suivant :

Fonctions couramment utilisées dans la programmation de socket php et la mise en œuvre dune simple interaction c/s

注意Lorsque le serveur est à l'écoute, le processus est suspendu et aucun d'autres opérations peuvent être effectuées. Vous devrez peut-être démarrer un autre terminal pour exécuter le programme client

Recommandations associées :

Comment PHP et MySql implémentent-ils la lecture des données d'arrière-plan (Code) ?

Thinkphp5 utilise le minuteur Workerman pour explorer régulièrement le contenu du site

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!