mercoledì 15 maggio 2013

Invio file tramite Socket Php

Con php è possibile, proprio come con il java o il c++ o qualunque altro linguaggio, implementare dell socket tcp per lo scambio di dati secondo lo schema client-server.
Vi mostro come è possibile inviare un file di testo tramite una socket in php da un client verso un server implementando soltanto 2 file php: Server.php e Client.php.
Iniziamo dal Server:
<?php
set_time_limit(0);
if( !( $sock = @socket_create( AF_INET, SOCK_STREAM, SOL_TCP ) ) ) {
echo socket_strerror(socket_last_error($sock)); exit;
}
if( !( @socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1 ) ) ) { echo socket_strerror(socket_last_error($sock));
exit;
}
if( !( @socket_bind( $sock, ’10.0.1.4′, 1048 ) ) ) { // Associamo un ip della macchina e la porta al socket
echo socket_strerror(socket_last_error($sock)); exit;
}
if( !( @socket_listen( $sock ) ) ) { // mettiamo il socket in ascolto
echo socket_strerror(socket_last_error($sock)); exit;
}
while( true ) {
if( !( $client = @socket_accept( $sock ) ) ) { // funzione bloccante: finchè non arriva una richiesta si
echo socket_strerror(socket_last_error($sock));
exit; }
if( !( @socket_getpeername( $client, $addr ) ) ) { // prendiamo l’IP del client che si è connesso echo socket_strerror(socket_last_error($sock));
exit;
}
echo “Client connection from: $addr\n”;
echo “Receiving file .”;
if( !( $file = @fopen( “”.time().”.txt”, “w” ) ) ) {
echo “File open error.\n”; exit;
}
if( !( $rcv = @socket_read( $client, 1024, PHP_BINARY_READ ) ) ) {
echo socket_strerror(socket_last_error($sock));
exit; }
do {
if( !( @fwrite( $file, $rcv, 1024 ) ) ) {
echo socket_strerror(socket_last_error($sock));
exit; }
if( !( @socket_write( $client, “ok” ) ) ) {
echo socket_strerror(socket_last_error($sock));
exit;
}
if( !( $rcv = @socket_read( $client, 1024, PHP_BINARY_READ ) ) ) { echo socket_strerror(socket_last_error($sock));
exit;
}
echo “.”;
} while( $rcv != “–@END@–” );
echo “DONE\n”; socket_close( $client ); break;
}
fclose( $file );
socket_close( $sock );
?>
E ora il client:
<?php
set_time_limit(0); // Evita che dopo un tot di tempo l’interprete php blocchi lo script come da php.ini
if( !( $file = @fopen( “miofile.txt”, “r” ) ) ) {
echo “File open error\n.”;
exit; }
$server = array( ‘address’ => ’inserisci ip del server′, ‘port’ => 1048 );
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if( !( $connessione = @socket_connect( $sock, $server['address'], $server['port'] ) ) ) { echo socket_strerror(socket_last_error($sock));
exit;
}
echo “Uploading file.”;
do {
if( feof( $file ) ) {
echo “send complete\n”; socket_write( $sock, “–@END@–” ); break;
}
if( !( $pkt = @fread( $file, 1024 ) ) ) {
echo socket_strerror(socket_last_error($sock));
exit; }
if( !( @socket_write( $sock, $pkt, 1024 ) ) ) {
echo socket_strerror(socket_last_error($sock)); exit;
}
echo “.”;
if( !( $rcv = @socket_read( $sock, 1024 ) ) ) {
echo socket_strerror(socket_last_error($sock)); exit;
}
//echo $rcv.”\n”;
} while( true );
echo “DONE\n”;
fclose( $file ); socket_close( $sock ); echo “Exiting…\n”;
?>
Avviate prima la socket server e poi la socket client e vedrete che il file “miofile.txt” verrà inviato dal client verso il server!

Nessun commento:

Posta un commento