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
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
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
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
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?
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ù.
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?
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ù.
umberta
3 Ottobre 2018 at 9:07
Non funziona niente, ignorante
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.
Federica
10 Ottobre 2018 at 8:32
Facile copiare il codice : https://www.codeproject.com/Tips/418814/Socket-Programming-in-PHP
Anno 2012
Daniele Carnovale
10 Ottobre 2018 at 10:02
Fuocherellino …. se non ricordo male l’ho copiato già in italiano. Comunque grazie della segnalazione, articolo e sito interessante.
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
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.
umberta
3 Ottobre 2018 at 9:07
Non funziona niente, ignorante
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.
Federica
10 Ottobre 2018 at 8:32
Facile copiare il codice : https://www.codeproject.com/Tips/418814/Socket-Programming-in-PHP
Anno 2012
Daniele Carnovale
10 Ottobre 2018 at 10:02
Fuocherellino …. se non ricordo male l’ho copiato già in italiano. Comunque grazie della segnalazione, articolo e sito interessante.
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
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.
Simone
5 Ottobre 2018 at 17:41
Funziona solo su linux o anche su windows?
Daniele Carnovale
6 Ottobre 2018 at 21:40
Con le librerie giuste dovrebbe funzionare anche su windows.
Simone
5 Ottobre 2018 at 17:41
Funziona solo su linux o anche su windows?
Daniele Carnovale
6 Ottobre 2018 at 21:40
Con le librerie giuste dovrebbe funzionare anche su windows.
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.