Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/10/2011, 14:43
Avatar de jotaincubus
jotaincubus
 
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 19 años, 6 meses
Puntos: 394
[APORTE] Aplicación para entender SOCKETS PHP

STREAMING Y SOCKETS

Muchas veces cuando la gente escucha la palabra STREAMING se imagina ver vídeos o escuchar música por internet, pues nada mas equivocado que esto ya que cuando se habla de STREAMING se esta refiriendo a convertir cierto tipo de información en bits para poder ser enviado a través de un protocolo de internet.

Resulta que PHP es tan completo que este es capaz de recibir y enviar información por cualquiera de los protocolos de INTERNET ya sean TCP, UDP e ISMP.

Cuando hablamos de SOCKETS lo que quiere decir es que PHP es capaz de usar un puerto de la tarjeta de red para recibir y enviar información a través de el, para poder comunicarse con cualquier programa (Ya sea de escritorio o para la WEB) para trabajar con el.

En este sencillo ejemplo tratare de mostrar como se crea un código "servidor" y un código "cliente" para abrir un SOCKET y podamos enviar y recibir información a través de dicho socket.

IMPORTANTE: Para trabajar con SOCKETS es necesario habilitar DEFAULT_SOCKET_TIMEOUT y EXTENSION = PHP_SOCKETS.DLL en el PHP.INI

NOTA: No explicare los códigos ya que comente las lineas para su fácil comprensión.

CODIGO SERVIDOR
Código PHP:
Ver original
  1. <?php
  2. // dejamos en cero para que la conexion acepte la conexiones a ese y esta nunca se cierre
  3.  
  4. // creamos el array que contiene la informacion que queremos buscar
  5. $contenido = array('banano' => 10, 'manzana' => 18, 'peras' => 50);
  6. // la ip del servidor en la cual se va a crear el socket
  7. $ip = '127.0.0.1';
  8. // el puerto por el cual escuchara peticiones
  9. $puerto = '7001';
  10.  
  11. /* CREANDO EL SOCKET
  12. AF_INET sirve para especifcar el protocolo en que se basara la conexion (AF_INET - AF_INET6 - AF_UNIX)
  13. SOCK_STREAM indica como se enviaran y recibiran los bytes en la conexion
  14. */
  15. $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
  16. // vinculamos el puerto a la IP
  17. socket_bind($socket, $ip, $puerto) or die ('No se puede vincular el puerto a la IP');
  18. // en caso de error lo mostramos para saber que pasa
  19. // hacemos el que socket escuche peticiones
  20. socket_listen($socket);
  21.  
  22. while(1){
  23.     // aceptamos la conexion que nos entre
  24.     $cliente[++$i] = socket_accept($socket);
  25.     // leemos la informacion que nos envian
  26.     $input = socket_read($cliente[$i], 1024);
  27.     // quitamos espacios y saltos de linea de lo que se lee
  28.     $ticker = ereg_replace("[ \t\r\n]", "", $input);
  29.     // escribimos lo que recibimos
  30.     echo "Ticker: $ticker";
  31.    
  32.     if(array_key_exists($ticker, $contenido)){
  33.         // ahora si buscamos la informacion que leimos en el socket
  34.         // dentro del array de contenido
  35.         $precio = $contenido[$ticker];
  36.     }else{
  37.         // si no existe pues le decimos que lo que
  38.         // busco no esta dentro del contenido
  39.         $precio = "No se encontro el ticket";
  40.     }
  41.     // escribimos los resultados que encontramos dentro del
  42.     // array en el socket para que el cliente los lea
  43.     socket_write($cliente[$i], $precio . "\n\r", 1024);
  44.     // cerramos la conexion de ese cliente
  45.     socket_close($cliente[$i]);
  46. }
  47. // cerramos la conexion global
  48. socket_close($socket);
  49. ?>

AF_INET - AF_INET6 - AF_UNIX
SOCK_STREAM

CODIGO CLIENTE
Código PHP:
Ver original
  1. <?php
  2. while(1){
  3.     // mostramos un mensaje de bienvenida y una breve explicacion
  4.     echo "Por favor ingrese un ticket, 'q' para salir: ";
  5.    
  6.     // eliminamos espacion en blanco del principio y fin de la cadena
  7.     // y obtenemos los que se escribio
  8.     $ticker = trim(fgets(STDIN));
  9.     // si el usuario presiono Q pues lo sacamos de la aplicacion
  10.     if ($ticker == 'q'){exit;}
  11.     // si escribio un ticket pues le imprimo lo que escribio
  12.     echo "Ticker = $ticker ";
  13.    
  14.     // creo el socket
  15.     // SOL_TCP el tipo de protocolo que se utilizara para la transmision (SOL_TCP - SOL_UDP)
  16.     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  17.    
  18.     // La comparacion para verificar si el socket se creo correctamente
  19.     // debe ser con triple =
  20.     if($socket === FALSE){
  21.         echo 'Creacion del socket fallida.';
  22.     }else{
  23.         // nos conectamos al socket servidor
  24.         $resultado = socket_connect($socket, '127.0.0.1', '7001');
  25.         if($resultado === FALSE){
  26.             echo 'Conexion al socket fallida.';
  27.         }else{
  28.             // ahora escribimos en el socket para que el servidor
  29.             // lea lo que nosotros le enviamos
  30.             socket_write($socket, $ticker, strlen($ticker));
  31.             // leemos el resultado que el socket nos envio
  32.             $precio = socket_read($socket, 1024);
  33.             // imprimimos el resultado que leimos
  34.             echo " $precio";
  35.         }
  36.     }
  37. }
  38. ?>

Bueno ahora vamos a probar el código, para hacerlo vamos a hacer uso de la consola de comandos. Primero vamos a abrir el código servidor en una consola para que esta cree el socket y escuche las peticiones y después en otra consola de comando abrimos el cliente para que se conecte a ese socket:

NOTA: OJO yo uso appserv asi que la ruta del archivo la deben cambiar, en las citas por ejemplo muestro ruta de wamp

CODIGO SERVIDOR

Cita:
C:\>php -f C:\wamp\www\servidor.php
La operación se ha completado correctamente.
Ese mensaje se muestra cuando la creacion del SOCKET fue exitosa y este esta esperando peticiones.

Ahora EN OTRA CONSOLA DE COMANDOS abrimos el cliente:

CODIGO CLIENTE

Cita:
C:\>php -f C:\wamp\www\cliente.php
Por favor ingrese un ticket, 'q' para salir:
Apenas entremos PHP mostrara el mensaje que colocamos:
Cita:
C:\>php -f C:\wamp\www\cliente.php
Por favor ingrese un ticket, 'q' para salir:
Ahora bien si nosotros colocamos un ticket valido como por ejemplo "banano" entonces PHP escribirá en el SOCKET esa información, después el código servidor leerá esa información, realizara la búsqueda en el array y si lo encuentra escribirá en el socket la cantidad de bananos que tenemos en el socket, la pagina cliente leerá esa información y nos la mostrara en la consola de comandos así:

RESULTADO
Cita:
C:\>php -f C:\wamp\www\cliente.php
Por favor ingrese un ticket, 'q' para salir: banano
Ticker = banano 10
Por favor ingrese un ticket, 'q' para salir:
Como ven queda esperando por si queremos hacer mas consultas (Para eso son los while), pero como no queremos pues presiona "q" a ver que pasa:

RESULTADO
Cita:
C:\>php -f C:\wamp\www\cliente.php
Por favor ingrese un ticket, 'q' para salir: banano
Ticker = banano 10
Por favor ingrese un ticket, 'q' para salir: q
C:\>
Como ven nos saco del programa.

Bueno eso es todo, espero que esto le ayude a la gente que esta comenzando en este mundo de PHP y que a veces se hace un poco complicado.

NOTA: Ya se que EREG_REPLACE esta depreciada y se desaconseja su uso pero quise hacer el ejemplo lo mas sencillo posible.
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???