Blog

Esempio client server con socket in php

Socket in php

In questa guida creeremo una connessione socket in php tra client e server. Spesso chi si affaccia per le prime volte alla programmazione php, fa confusione pensando che il client in una comunicazione client-server è il browser utente. Non è così, infatti il codice php viene eseguito sul server (Apache) che restituisce al browser utente il risultato della sua esecuzione. Quindi quando parliamo di comunicazione Client-Server in php, si intende che la comunicazione avviene tra due server php, dove dal punto di vista della comunicazione, uno dei due funge da client.

Di conseguenza il server in questione è la macchina che accetta connessioni in ingresso, ed il cliente è la macchina che chiede una connessione.

Server

<?php
error_reporting(E_ALL);
/* Si indica allo script di non uscire mentre attende una connessione */
set_time_limit(0);
/* Abilita lo scarico dell'output così si è in grado di vedere cosa passa
 * non appena arrivano i dati al server. */
ob_implicit_flush();

// settaggio variabili, il server ascolta sul proprio indirizzo ip  
$host = "127.0.0.1";
$port = 25003;
// setta timeout!
set_time_limit(1110);
// crea socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Creazione socket fallita\n");
// Lega il socket alla porta $port sul server $host 
$result = socket_bind($socket, $host, $port) or die("Fallito inizializzazione porta su socket\n");
// Inizio ascolto sulla connessione
$result = socket_listen($socket, 3) or die("Start ascolto socket fallito\n");
// Accetta Connessioni
// Attende l'arrivo di una connessione client
$spawn = socket_accept($socket) or die("Inizializzazione connessione con client fallita\n");
// Legge Client input
$input = socket_read($spawn, 1024) or die("Errore Non riesco a leggere l'input\n");
$input = trim($input);
echo "Messaggio Client : ".$input;

$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Errore di scrittura su output\n");
//Chiudi sockets
socket_close($spawn);
socket_close($socket);
 ?>

Client

<?php
error_reporting(E_ALL);
echo "<h2>Connessione TCP/IP </h2>\n";
// Settaggio variabili client
$host = "IP SERVER";
$port = 25003;
$message = "Ciao Server";
echo "Messaggio per il Server :".$message;
// crea socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Socket non creato\n");
// connettiti al server
$result = socket_connect($socket, $host, $port) or die("Impossibile connettersi al server\n");
// invia stringa al server
socket_write($socket, $message, strlen($message)) or die("Impossibile inviare i dati al server\n");
// restituisci risposta del server
$result = socket_read ($socket, 1024) or die("Impossibile leggere la risposta del server\n");
echo "Risposta del Server :".$result;
//chiudi socket
socket_close($socket); ?>

12 Comments

  1. Matteo

    Ciao Daniele complimenti per l’articolo è molto utile e interessante, ti scrivo perchè ho questo problema: io ho due raspberry sui quali gira apache, ho fatto una pagina php client e server su entrambi, solo che mi restituisce questo errore per il server “Fallito inizializzazione porta su socket” e questo per il client “Impossibile leggere la risposta del server”. Sapresti dirmi perchè? Grazie in anticipo,Matteo

    1. Daniele Carnovale

      Ciao Matteo, grazie per i complimenti. Per l’errore di fallita inizializzazione i problemi potrebbe essere che la porta scelta è già in uso oppure che il firewall blocca la porta scelta. Il secondo errore potrebbe essere il valore del lenght = 1024 che và impostato diversamente per il tuo caso. Prova a guardare a questo link http://php.net/manual/en/function.socket-read.php

      1
      1
  2. Bryan

    Ciao, articolo molto utile però non capisco perché quando apro il file del client continua a caricare all’infinito e poi mi da errore HTTP 524…
    Avevo già provato una volta e andava ma ora non più e non capisco come risolvere, sapresti aiutarmi?

    1. Daniele Carnovale

      Ciao Scusa il ritardo nella risposta. E’ probabile che hai qualche problema sul server a livello di permessi di porte in ingresso o in uscita. Dovresti capire dove il codice si blocca per capirne di più.

      1
      1
  3. umberta

    Non funziona niente, ignorante

    1
    2
    1. Daniele Carnovale

      Scusa ma prima di offendere potresti chiedere. Dagli altri commenti sembra che a qualcuno ha funzionato. Se a te non funziona potremmo cercare di aiutare anche qualcun’ altro che magari ha il tuo stesso problema. Esponi il problema che proviamo a farlo funzionare. Considera che è un articolo datato ormai.

      2
      1
      1. Federica
        1. Daniele Carnovale

          Fuocherellino …. se non ricordo male l’ho copiato già in italiano. Comunque grazie della segnalazione, articolo e sito interessante.

    2. Umberta

      Si scusami…ero fattissimo
      Comunque ho riprovato il codice, il mio problema è che quando avvio il server mi carica all’infinito.
      Sai aiutarmi?
      Prego

      1. Daniele Carnovale

        Cosa vuoi dire che carica all’infinito? stampa qualche errore?
        se funziona bene al punto
        // Inizio ascolto sulla connessione
        il server sta in attesa di ricevere una connessione dal client.
        potrebbe sembrare che è in loop infinito ma è solo in ascolto su un socket.

  4. Simone

    Funziona solo su linux o anche su windows?

    1. Daniele Carnovale

      Con le librerie giuste dovrebbe funzionare anche su windows.

Leave a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.