Privacy Policy Esempio client server con socket in php - Daniele Carnovale
 

PHPUbuntu8 Dicembre 2016by Daniele Carnovale25Esempio 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); ?>

25 comments

  • Matteo

    4 Marzo 2018 at 11:12

    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

    Reply

    • Daniele Carnovale

      4 Marzo 2018 at 12:43

      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

      Reply

  • Matteo

    4 Marzo 2018 at 11:12

    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

    Reply

    • Daniele Carnovale

      4 Marzo 2018 at 12:43

      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

      Reply

  • Bryan

    19 Marzo 2018 at 20:15

    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?

    Reply

    • Daniele Carnovale

      21 Marzo 2018 at 14:29

      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ù.

      Reply

  • Bryan

    19 Marzo 2018 at 20:15

    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?

    Reply

    • Daniele Carnovale

      21 Marzo 2018 at 14:29

      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ù.

      Reply

  • umberta

    3 Ottobre 2018 at 9:07

    Non funziona niente, ignorante

    Reply

    • Daniele Carnovale

      3 Ottobre 2018 at 9:29

      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.

      Reply

    • Umberta

      5 Ottobre 2018 at 8:44

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

      Reply

      • Daniele Carnovale

        6 Ottobre 2018 at 21:55

        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.

        Reply

  • umberta

    3 Ottobre 2018 at 9:07

    Non funziona niente, ignorante

    Reply

    • Daniele Carnovale

      3 Ottobre 2018 at 9:29

      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.

      Reply

    • Umberta

      5 Ottobre 2018 at 8:44

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

      Reply

      • Daniele Carnovale

        6 Ottobre 2018 at 21:55

        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.

        Reply

  • Simone

    5 Ottobre 2018 at 17:41

    Funziona solo su linux o anche su windows?

    Reply

    • Daniele Carnovale

      6 Ottobre 2018 at 21:40

      Con le librerie giuste dovrebbe funzionare anche su windows.

      Reply

  • Simone

    5 Ottobre 2018 at 17:41

    Funziona solo su linux o anche su windows?

    Reply

    • Daniele Carnovale

      6 Ottobre 2018 at 21:40

      Con le librerie giuste dovrebbe funzionare anche su windows.

      Reply

  • Kandy

    19 Agosto 2021 at 2:25

    I visited many websites however the audio quality for audio songs present at this site is genuinely superb.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *