PHP Socket client TCP


Exemple

Création d'un socket utilisant le protocole TCP (Transmission Control Protocol)

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

Assurez-vous que le socket est créé avec succès. La fonction onSocketFailure provient de l'exemple de manipulation des erreurs de socket dans cette rubrique.

if(!is_resource($socket)) onSocketFailure("Failed to create socket");

Connectez la prise à une adresse spécifiée

La deuxième ligne échoue normalement si la connexion échoue.

socket_connect($socket, "chat.stackoverflow.com", 6667)
        or onSocketFailure("Failed to connect to chat.stackoverflow.com:6667", $socket);

Envoi de données au serveur

La fonction socket_write envoie des octets via une socket. En PHP, un tableau d'octets est représenté par une chaîne, qui est normalement insensible au codage.

socket_write($socket, "NICK Alice\r\nUSER alice 0 * :Alice\r\n");

Recevoir des données du serveur

L'extrait suivant reçoit des données du serveur à l'aide de la fonction socket_read .

Passer PHP_NORMAL_READ comme troisième paramètre lit jusqu'à un octet \r / \n , et cet octet est inclus dans la valeur de retour.

Passer PHP_BINARY_READ , au contraire, lit la quantité de données requise à partir du flux.

Si socket_set_nonblock été appelé auparavant et que PHP_BINARY_READ est utilisé, socket_read renverra false immédiatement. Sinon, la méthode bloque jusqu'à ce que suffisamment de données (pour atteindre la longueur du deuxième paramètre ou pour terminer une ligne) soient reçues ou que le socket soit fermé.

Cet exemple lit les données d'un serveur supposé IRC.

while(true) {
    // read a line from the socket
    $line = socket_read($socket, 1024, PHP_NORMAL_READ);
    if(substr($line, -1) === "\r") {
        // read/skip one byte from the socket
        // we assume that the next byte in the stream must be a \n.
        // this is actually bad in practice; the script is vulnerable to unexpected values
        socket_read($socket, 1, PHP_BINARY_READ);
    }

    $message = parseLine($line);
    if($message->type === "QUIT") break;
}

Fermer la prise

La fermeture du socket libère le socket et ses ressources associées.

socket_close($socket);