Ahora que tengo tiempo libre quise hacer un socket server local en Windows en PHP, aunque también funciona en Linux o Mac. Los socket servers permiten hacer aplicaciones multiusuario como chats, juegos o cualquier cosa que requiera tiempo real.
Recomiendo que lean el manual de PHP en el apartado de sockets, la información esta muy entendible y muy facil de digerir. También lee las Diferencias al trabajar con PHP en Linux y Windows. Les voy a explicar como lo hice:
Ingredientes para un socket server en PHP
- WAMPserver 2.0
- PHP 5.2.9-2 (Por defecto no va a venir instalado, pero lo pueden conseguir aquí). Tuve muchos problemas con la versión 5.3.0.
- Apache 2.2.11 (opcional, yo trabaje con esta versión)
O directamente en el archivo php.ini Clic izq. en el icono >> PHP >>php.ini
Y buscan esta línea: extension=php_sockets.dll A la cual le quitan el punto y coma que tiene al inicio.
Una vez hecho esto, reinician el wampserver.
Para tener información más completa acerca de su PHP, pueden respaldar el archivo index.php que esta en la carpeta 'www' y crear su propio phpinfo, esto se hace creando un nuevo archivo index.php, pero ahora con esta línea:
Código :
<?php phpinfo(); ?>
Ahora pueden verificar el estado de su PHP, y buscar si ya tienen activada la extensión para sockets, para esto busquen este apartado y verifiquen que Sockets Support sea 'enabled':
Ahora tenemos que crear nuestro demonio o daemon, este se encargará de escuchar en todo momento nuestras peticiones como clientes y de enviarnos las respuestas del servidor. Yo utilice este sencillo script que está en el apartado de 'socket_accept' en el manual de PHP y en específico en la ayuda para sockets:
Código :
<?php $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_bind($socket,'127.0.0.1',65500); socket_listen($socket); echo "Esperando conexión\n\n"; $conn = false; switch(@socket_select($r = array($socket), $w = array($socket), $e = array($socket), 60)) { case 2: echo "Conexión rechazada!\n\n"; break; case 1: echo "Conexión aceptada!\n\n"; $conn = @socket_accept($socket); break; case 0: echo "Tiempo de espera excedido!\n\n"; break; } if ($conn !== false) { // communicate over $conn } ?>
Lo guardamos en la carpeta 'www' del wampserver.
Ahora algo interesante y crucial para que esto funcione en windows. En muchos de los ejemplos que estuve viendo aparece una línea un poco extraña (para los que no estamos muy familiarizados con Linux):
Código :
#!/usr/local/bin/php –q
Esta línea en Linux funciona para apuntar hacia la ubicación de nuestra CLI de PHP.
Esto sirve para ejecutar el archivo binario de la CLI y el archivo que lo contenga se inicialice al arrancar nuestro servidor y se mantenga activo en segundo plano (algo así como un servicio).
Pero lo que nosotros necesitamos en windows es crear un proceso que mantenga activo a nuestro demonio o daemon, para esto crearemos un archivo con formato .bat el cual (de preferencia) guardaremos en la carpeta del wampserver (en mi caso c:/wamp), el archivo debe incluir la siguiente línea:
(Lo pueden crear con el bloc de notas)
Código :
c:/wamp/bin/php/php5.2.9-2/php.exe -q c:/wamp/www/socket.php
En donde:
c:/wamp/bin/php/php5.2.9-2/php.exe > Apunta hacia la ruta de nuestra CLI en windows.
c:/wamp/www/socket.php > Apunta a nuestro script PHP que funciona como demonio.
Ahora para ejecutarlo necesitamos acceder a él por medio del línea de comando en windows, presionamos la combinación de teclas 'Windows + R' escribimos cmd y presionamos enter.
Una vez abierta la ventana de línea de comandos, si nuestra instalación del wampserver está en c:/, tecleamos: c:/wamp/run
Y tendrán que ver algo igual a esto:
Si quieren tener un poco más de comodidad para iniciar este proceso, pueden crear un acceso director en el escritorio:
Clic derecho en el escritorio >> Nuevo >> Acceso directo >> pegan esta línea:
Código :
cmd /k c:/wamp/run
¡Listo! Con esto ya deberíamos tener nuestro servidor funcionando, ahora solo falta probarlo, creamos un script PHP con el siguiente código:
Código :
<?php /* *http://www.php.net/manual/en/ref.sockets.php */ $host = "127.0.0.1"; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $puerto = 65500; if (socket_connect($socket, $host, $puerto)) { echo "\nConexion Exitosa, puerto: " . $puerto; } else { echo "\nLa conexion TCP no se pudo realizar, puerto: ".$puerto; } socket_close($socket); ?>
Lo pueden llamar conectar.php y lo guardan en la carpeta 'www' del wampserver, finalmente lo ejecutan desde su navegador: http://localhost/conectar.php
y deberían tener algo igual a esto:
Y como postre:
Si quieren que su servidor sea visto por todos los equipos de su red, pueden hacer esto:
Clic izq. en el icono de wampserver >> Apache >> httpd.conf
Hagan un respaldo del archivo antes de hacer esto!!
Busquen la línea:
Código :
ServerName 127.0.0.1:80
Pueden ponerle una almohadilla o gato (numeral #) detrás de línea para comentarla, así: #ServerName 127.0.0.1:80
Ahora agreguen otra línea igual cambiando el 127.0.0.1 por la ip de su computadora, en mi caso:
Código :
ServerName 192.168.1.105:80
Guarden y reinicien el wampserver, ahora solo desde otro equipo de tu red teclea tu ip, ósea: http://192.168.1.105
Espero que sea de su agrado.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Freddie el 27 de Abril de 2011
Por px87 el 27 de Abril de 2011
Se me paso comentar en el tutorial que el nombre del archivo ".bat" puede ser cualquiera, yo lo llame "run.bat".
Saludos.
Por Lexas el 27 de Abril de 2011
También lo vi muy oportunamente, pues justo estoy trabajando en un sistema de peleas basadas en navegador me será muy util.
Gracias px87, jamás te olvidaré
Por Socr@m el 27 de Abril de 2011
Muchas gracias!
Por px87 el 28 de Abril de 2011
Saludos.
Por Vasily el 14 de Mayo de 2011
Por Vasily el 14 de Mayo de 2011
Por vasily el 14 de Mayo de 2011
Por alexis el 08 de Junio de 2011
Por px87 el 13 de Junio de 2011
Me disculpo por no contestar, pero me cambie de casa y hasta hoy no me han puesto el internet!!!
Saludos.
Por yves el 14 de Junio de 2011
Mil gracias por tus explicaciones sobre el socket server.
Hice to do lo que dice tu tutorial hasta crear el acceso directo cmd /k c:/wamp/run
cuando hago clic sobre el icono cmd.exe me regresa el siguiente mensaje: "c:/wamp/run" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable
estoy bloqueado a este nivel
Gracias por tu ayuda
Yves
Por yves el 14 de Junio de 2011
Ya arregle los problemas:
1) el archivo bat debe ser nombrado run.bat cuando la linea de comando cmd.exe es cmd /k c:/wamp/run
2) ademas de configurar usando el icono Wamp => PHP => PHP extensions => php_sockets se tiene que configurar tambien en C:\wamp\bin\php\php5.2.9-1:
php.ini y phpForApache.ini En ambnos quiter el : frente a extension=php_sockets.dll
Otra pregunta: se puede usar este script pero con public IP para realizar este tipo de aplicacion?:
tengo varios modems que mandan de manera automatica y regular una trama de datos via Celular/Internet a una direccion IP/puertos.
En esta direccion IP tengo un servidor que
1) debe escuchar los puertos
2) reconocer las tramas
3) recibir las tramas
4) seriarlas (cada trama tiene el ID del modem fuente) y
5) guardarlas en el archivo correspondiente.
Atentamente
Yves
Por px87 el 17 de Junio de 2011
Supongo que si, no deberías tener ningun problema.
Por Inyaka el 19 de Diciembre de 2011
Por Josema el 01 de Enero de 2012
Tengo un problema, he probado este script y he hecho mi cliente en flash. Cuando conecto en localhost y pruebo todo perfecto, pero cuando lo intento hacer de forma externa no me funciona. He habierto el puerto y todo pero nunca conecta...
Tengo un router y mi ip local es 192.168.1.10, pero mi ip publica es 95.0.25.12. Digo esto, porque cuando hago socket_bind, si es con la ip privada el script funciona perfectamente pero si lo intento con la ip publica me tira un error: "PHP Warning: socket_bind(): unable to bind address [0]: La direcci¾n solicitada
no es vßlida en este contexto."
Que puedo hacer?
Gracias de antemano.
Por verijazmin el 29 de Febrero de 2012
Por Ale el 06 de Marzo de 2012
Muchas gracias, a ver si luego hago la prueba de que funcione en mi casa, Saludos.
Por gerardo el 08 de Agosto de 2012
Por DANIEL el 03 de Septiembre de 2012
Por Pedro Daniel el 13 de Mayo de 2013
Por Ozmank el 29 de Septiembre de 2013
Por raptor0555 el 13 de Noviembre de 2013
Por Ricardo el 13 de Febrero de 2014
soy nuevo en esto de la programación, tengo un sensor ultrasonico lo cual requiere este tipo de programacion, su funcion del sensor es mandar datos tales como estos: (“N, D, L, D1, V, T1, T2, S1” ) cada campo son su respectivo valor, mi pregunta es como recibo esos datos en un servidor?? me seria de gran ayuda. Gracias
Por Christopher el 17 de Febrero de 2014
$talkback = "PHP: You said '$buf'.\n";
socket_write($msgsock, $talkback, strlen($talkback));
echo "$buf\n";
por las que necesites para tratar la cadena que esta en la variable $buff.
Por Uriel el 11 de Agosto de 2014
Por Edward el 11 de Octubre de 2014
el servername es el ip del hosting donde se encuentra la aplicacion?..
el puerto es proporcionado por el hosting o igual puedo usar cualquiera?
en el servidor local ejecuto el demonio con cmd, como haria eso en el hosting? con un archivo .bat?.. disculpen por ser novato y gracias por el aporte
Por Victor Grajales el 27 de Enero de 2015
Por jpier - jeanpiereche el 16 de Junio de 2015
Por Niko el 21 de Julio de 2015
Por Alex el 03 de Agosto de 2015
Por Eduardo el 20 de Julio de 2016
Warning: socket_listen(): unable to listen on socket [10022]: Se ha proporcionado un argumento no v�lido. in C:\xampp\htdocs\sockets\sock.php on line 4
Esperando conexión
Ami me ha estado saliendo este error, entiendo que es algo del puerto, como puedo solucionarlo, ya he cambiado varias veces el puerto
Por Lo absurdo el 04 de Septiembre de 2016
Por Lo absurdo el 04 de Septiembre de 2016
Por erny el 09 de Septiembre de 2016
Por Abraham Rojas el 29 de Diciembre de 2016
Saludos