Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] socket

Estas en el tema de socket en el foro de PHP en Foros del Web. Buenas a todos. Soy totalmente nuevo en el tema de socket. Estuve mirando el manual de php sobre socket pero no termine de entender como ...
  #1 (permalink)  
Antiguo 07/08/2014, 04:29
 
Fecha de Ingreso: abril-2013
Ubicación: Barcelona
Mensajes: 78
Antigüedad: 11 años
Puntos: 2
socket

Buenas a todos.
Soy totalmente nuevo en el tema de socket.
Estuve mirando el manual de php sobre socket pero no termine de entender como funciona.
¿Hay que tener control total del servidor para abrir puertos?
¿Como funciona exactamente?

Estuve intentando practicar con un ejemplo que encontré sobre un chat pero no encuentro uno que sea tan corto como para entenderlo poquito a poco.
¿Alguien me puede poner el ejemplo mas corto posible?

Muchas gracias de antemanos.
  #2 (permalink)  
Antiguo 07/08/2014, 10:06
 
Fecha de Ingreso: abril-2013
Ubicación: Barcelona
Mensajes: 78
Antigüedad: 11 años
Puntos: 2
Respuesta: socket

Conseguí que me funcione pero no se como dejar el bucle siempre activo sin que me salte error 500.
tengo un archivo server.php con esto:
Código PHP:
<?php
set_time_limit
(0);
    
$socket socket_create(AF_INETSOCK_STREAMSOL_TCP);
    
socket_bind($socket'0'8080);
    
socket_listen($socket);
    if (
$socket === false) {
    
$errorcode socket_last_error();
    
$errormsg socket_strerror($errorcode);
    die(
"No se pudo crear el socket: [$errorcode] $errormsg");
    }
    
$tamano=2048;
    while(
1){
    
$cliente=socket_accept($socket);
    
$buffer=socket_read($cliente$tamano); //leemos mensaje del cliente
    
$buffer="Hola, ".$buffer;
    
socket_write($cliente$buffer); //escribimos el buffer
    
socket_close($cliente); //cerramos cliente
    
}
//socket_close=>cierra el recurso socket dado por $socket
socket_close($socket);
    
socket_close($socket);
?>
Pero para que me funcione tengo que recarga la pagina de server.php y después rápidamente el client.php
¿Como lo dejo ejecutando?
  #3 (permalink)  
Antiguo 07/08/2014, 11:48
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: socket

Hola @sekafry te comento mi experiencia que tal vez te sirva para dar los primeros pasos con los websockets, yo tengo un VPS con debian, php 5.4 y servidor web nginx, me descargue los fuentes de este tutorial: http://www.sanwebe.com/2013/05/chat-...ket-php-socket que es para crear un chat con websockets.

Estos son los cambios que hice para hacerlo andar:
server.php
Linea 2: $host = '31.220.50.217'; //host
En esta linea puse la ip de mi VPS.
Linea 147: "WebSocket-Location: ws://$host:6338/web-sockets/chat/server.php\r\n".
La linea anterior estaba mal ya que hacia referencia a un archivo inexistente, en mi vps uso un mapeo de puertos, por eso puse 6338 en vez de 9000, en el mapeo tengo definido que el puerto publico 6338 corresponde con el 9000 interno, tambien tengo definido que el puerto publico 6336 corresponde al 80 interno. Luego del puerto va el path hasta la ubicacion del archivo.

index.php
Linea 43: var wsUri = "ws://31.220.50.217:6338/web-sockets/chat/server.php";
Puse la ip del VPS y el puerto que corresponde al 9000 (recuerda que con el mapeo, el 6338 se convierte en 9000, de acuerdo a mi configuracion actual) y luego el path hasta la ubicacion.

Esta url debe ser igual a la que se figura en la linea 147 de server.php.

Luego de eso, accedi por el navegador a: http://31.220.50.217:6336/web-sockets/chat/index.php y puedes ver que los websockets se conectan y funcionan correctamente.

En la web de este tutorial esta bastante bien explicado como funciona cada parte del script (esta en ingles, pero el esfuerzo vale la pena)

Te sugiero que intentes hacerlo andar asi como yo lo hice (solo que poniendo los datos de tu servidor en los parametros), una vez que lo tengas en funcionamiento puedes tranquilamente empezar a modificarlo y a jugar con las funciones para aprender bien que hace cada cosa.


Para responder puntualmente a tu pregunta:
El websocket no puede estar siempre funcionando, automaticamente muere luego de un tiempo cuando no hay nadie conectado, por eso debes iniciarlo accediendo a la pagina del server y luego a la del cliente.
Lo que si puedes hacer, es que el script inicie automaticamnete el socket si este no esta iniciado, para eso la via mas facil es crear un archivo auxiliar llamado status.txt en la carpeta del websocket, y, siguiendo el ejemplo anterior, en la linea 21 de server .php, antes del inicio del while infinito poner:

file_put_contents("status.txt", "on");

y en la linea 76 antes del cierre del socket poner:

file_put_contents("status.txt", "off");

ahora en el index.php, en la linea 41 antes del document.ready poner:

Código php:
Ver original
  1. <?php
  2.     if(file_get_contents("status.txt") != "on")
  3.     {
  4.         echo("$.post('http://31.220.50.217:6336/web-sockets/chat/server.php', {});");
  5.     }
  6. ?>

con eso si el websocket no existe se iniciara solo
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 07/08/2014 a las 12:19
  #4 (permalink)  
Antiguo 07/08/2014, 12:21
Avatar de alex171294  
Fecha de Ingreso: agosto-2014
Mensajes: 10
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: socket

los sockets son como enchufes entre las computadoras, hay dos formas de trabajar con socket, un socket se puede comportar como servidor (o lo más parecido en la realidad sería como enchufe hembra) esperando que alguien se conecte al él, y el socket se puede comportar como cliente, haciendo de enchufe macho, conectandose o enchufandose al lugar donde se indique.

Cuando uno habla de un socket que espera conexiones nuevas a esa pc donde se ejecuta se habla de un socket que se encuentra a la escucha (listen), cuando uno habla de un socket que se conecta a una computadora uno habla de un socket que realiza la conexion.

Entonces tu con los sockets tienes una forma de manejarlos para que esperen a que se conecten a ellos, y otra forma en la que el socket se conecta a otro socket.

Debe haber una pc que escuche esperando conexiones y al menos una pc que se le conecte para establecer una conexion entre ambas pc.

Por otra parte, lo que a ti te ocurre del error 500 es porque probablemente usas php_cgi (el php que es ejecutado por apache, en modo servidor web) y el mismo tiene un limite de tiempo de ejecucion, que depende de la configuración, pasado ese tiempo se finaliza la ejecución del script php de forma forsosa.

Para crear un servidor con sockets en php, debes ejecutar dicho codigo usando php_cli (command line interface o en modo consola).

Por otra parte te dejo un link a un proyecto en el que estoy trabajando para manipular sockets con eventos y objetos que quizá llegue a ser más simple si entiendes lo básico de sockets y miras la wiki del proyecto (ahí hay algunos ejemplos también)

https://github.com/alexander171294/PHPSocketMaster

saludos!
  #5 (permalink)  
Antiguo 08/08/2014, 03:55
 
Fecha de Ingreso: abril-2013
Ubicación: Barcelona
Mensajes: 78
Antigüedad: 11 años
Puntos: 2
Respuesta: socket

Gracias a todos.
Por lo que he entendido el servidor se puede hacer con php o con javascript pero en los dos hay que ejecutar una terminal ¿no?
Mi hosting no me permite hacerlo por lo que probare en un equipo mio.
  #6 (permalink)  
Antiguo 08/08/2014, 11:30
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: socket

Cita:
pero en los dos hay que ejecutar una terminal ¿no?
Yo tengo php instalado en debian como fpm en el servidor nginx, no tuve que ejecutar nada en la consola, si bien el readme del tutorial habla de un comando, yo nunca lo ejecute, solo copie los archivos, hice los cambios mencionado y salio andando
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #7 (permalink)  
Antiguo 09/08/2014, 00:35
 
Fecha de Ingreso: abril-2013
Ubicación: Barcelona
Mensajes: 78
Antigüedad: 11 años
Puntos: 2
Respuesta: socket

el readme es este:
Cita:
Running Server :

1. Change host address in index.php and server.php

2. Go to your shell command-line interface

3. type:
php -q c:\path\server.php

4. Using browser, navigate to index.php location to open chat page, have fun!
Si no hiciste el paso 2 y 3, ¿como lo hiciste para arrancarlo?
  #8 (permalink)  
Antiguo 09/08/2014, 07:53
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: socket

Cita:
Si no hiciste el paso 2 y 3, ¿como lo hiciste para arrancarlo?
Agregando las 4 lineas de codigo que mencione antes, las del file_put_contents y file_get_contents con esos cambios el server arranca solo al abrir el index si es que no esta iniciado.

por otro lado, una optimizacion muy interesante, seria que el loop ese no sea infinito, sino que lopee por un tiempo minimo (previamente definido) y luego solo siga si hay alguien conectado al chat, de esta forma se ahorrarian recursos del servidor ya que solo se ejecutaria cuando sea realmente necesario
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: socket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:18.