Comunidad de diseño web y desarrollo en internet online

Problemas con sockets desde PHP y Flash

Citar            
MensajeEscrito el 25 Jul 2007 07:38 pm
Hola, tengo un problema al tratar de implementar una aplicación con sockets desde PHP (Interactua con Flash 8). No se nada de JAVA, por eso opte por PHP, pues se me hace mas fácil y estoy mas acostumbrado a trabajar con el.

El código se les hará conocido, es el que está en la documentación de PHP, lo que sucede es que casi todo funciona bien y bonito, comunica varios equipos muy velozmente, pero al momento de que yo quiero mandar un mensaje, no me lo manda hasta que alguien mas manda otro mensaje, es decir:

Cuando alguien se conecta, le manda un mensaje a todos de que esa persona se conecto, pero esto no sucede, se queda en espera el mensaje hasta que otra persona escribe algo, solo así el mensaje se manda.

Aqui pongo el código que tengo, lo documento para que no se pierdan

Código :

#!/usr/bin/php -q
<?
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$address='127.0.0.1';
$port=9999;
// funcion que me escribe lo que va haciendo, para yo monitorearlo.
function escribir($mensaje){
   $archivo="control.txt";
   $ant=file_get_contents($archivo);
   $f=fopen($archivo,"w+");
   fwrite($f,$ant."[ ".date('Y-m-d H:i:s')." ]\n".$mensaje."\n\n");
   fclose($f);
}
//Ahi manda el mensaje a todos, parece funcionar bien =)
function sendTotalMsg($allclient,$socket,$buf){
   foreach($allclient as $client){
      escribir("Para $client: ".$buf);
      socket_write($client,"$socket ".date('Y-m-d H:i:s')." escribio: $buf");
   }
}
// Crea un separador en mi archivo de monitoreo
$archivo="control.txt";
$ant=file_get_contents($archivo);
$f=fopen($archivo,"w+");
fwrite($f,$ant."------------------------------------------[ ".date('Y-m-d H:i:s')." ]\n");
fclose($f);


//crea el socket y se conecta, en caso de error, me lo manda a mi archivo de monitoreo
if (($master=socket_create(AF_INET,SOCK_STREAM,SOL_TCP))<0){escribir("socket_create() FALLA:\n\t".socket_strerror($master));}else{escribir("socket_create() OK");}
socket_set_option($master,SOL_SOCKET,SO_REUSEADDR,1);
if (($ret=socket_bind($master,$address,$port))<0){escribir("socket_bind() FALLA:\n\t".socket_strerror($ret));}else{escribir("socket_bind() OK");}
if (($ret=socket_listen($master,SOMAXCONN))<0){escribir("socket_listen() FALLA:\n\t".socket_strerror($ret));}else{escribir("socket_listen() OK");}
$read_sockets=array($master);
//Empieza a escuchar los puertos
while (true){
   $changed_sockets=$read_sockets;
   $num_changed_sockets=socket_select($changed_sockets,$write=NULL,$except=NULL,NULL);
   foreach($changed_sockets as $socket){
      if ($socket==$master){
         if (($client=socket_accept($master))<0){
            escribir("socket_accept() FALLA:\n\t".socket_strerror($msgsock));
            continue;
         }else{
            //Esto sucede cuando alguien entra al chat
            array_push($read_sockets,$client);
            escribir("Entro >>> $client");
            //Se manda el mensaje de que alguien se conecta, pero se queda en el server hasta que alguien mande un mensaje en el chat.
            sendTotalMsg($allclients,"Administrador","$client entro a la sala\n");
         }
      }else{
         $bytes=socket_recv($socket,$buffer,2048,0);
         if ($bytes==0||trim($buffer)=="/salir"){
            escribir("Salio >>> ".$socket);
            //Se manda el mensaje de que alguien se desconecta
            sendTotalMsg($allclients,"Administrador","$socket se desconecto\n");
            $index=array_search($socket,$read_sockets);
            unset($read_sockets[$index]);
            socket_close($socket);
         }elseif(trim($buffer)=="/cerrar"){
            die("server end");
         }else{
            $allclients=$read_sockets;
            array_shift($allclients);
            //Manda perfectamente un mensaje que introduzca algún usuario
            sendTotalMsg($allclients,$socket,$buffer);
         }
      }
   }
}
?>


¿Cual es la direfencia de ejecutarlo donde yo lo pongo a donde venia en el script de la documentacion?
¿Como puedo mandar mensajes generados por el servidor?
¿Deben llevar algún parametro extra?
¿O acaso es algo que me falta?, no entiendo que es lo que sucede.

Muchas gracias por su atencion ^^

Por bryanisimo

664 de clabLevel



Genero:Masculino  

Geek

firefox
Citar            
MensajeEscrito el 25 Jul 2007 09:27 pm
SI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ya encontré la solución al problema. Solo hay que definir una variable que te indique como termina una linea:

Código :

$finbuffer=urldecode("%0A%00");


Y ya se pone el mensaje que quieras y se envía desde socket_write

Código :

socket_write($socket,"Gracias por tu mensaje".$finbuffer);

Por bryanisimo

664 de clabLevel



Genero:Masculino  

Geek

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.