owned Posted June 12, 2007 Share Posted June 12, 2007 Following socket server receives data from clients instantly as it should be. But server can send data to the client only when _client first makes a request_ to the server. How can server send data to the client instantly without needing client(s) to do requests every fraction of seconds to retrieve data in intensive apps ?? Help ??? If any client sends message to the server then some message can be distributed to other connected idle clients using that commented code. But how to make server send message without client's request? Socket_accept() might be the reason? E.g. how to make this following code to send messages to connected client(s) every second? Code: <?php $running=1; $print_send = "echo (\"<font color='red'>{\$output}</font>\"); ob_flush();flush();"; $print_receive = "echo (\"<font color='green'>{\$input}</font>\"); ob_flush();flush();"; echo(" <html> <head> </head> <body> "); echo ("<h1>SERVER</h1><br><font color='green'>RUNNING...</font>"); ob_flush();flush(); // Set time limit to indefinite execution set_time_limit (0); // Set the ip and port we will listen on $address = '<ip>'; $port = 666; $max_clients = 10; // Array that will hold client information $clients = Array(); $sid_socket_list=array(); // Create a TCP Stream socket $sock = socket_create(AF_INET, SOCK_STREAM, 0); // Bind the socket to an address/port socket_bind($sock, $address, $port) or die('Could not bind to address'); // Start listening for connections socket_listen($sock); // Loop continuously while($running==1){ // Setup clients listen socket for reading $read[0]=$sock; for($i = 0; $i < $max_clients; $i++){ if($client[$i]['sock'] != null){ $read[$i + 1] = $client[$i]['sock']; } } // Set up a blocking call to socket_select() $ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL); // if a new connection is being made add it to the client array if(in_array($sock, $read)){ for($i=0;$i<$max_clients;$i++){ if($client[$i]['sock'] == null){ $client[$i]['sock'] = socket_accept($sock); socket_getpeername($sock, $ip); $output = "welcome"; socket_write($client[$i]['sock'],$output.chr(0)); eval($print_send); break; }elseif($i == $max_clients - 1){ echo("too many clients"); } } if(--$ready <= 0){ continue; } } // end if in_array // If a client is trying to write - handle it now for($i=0;$i<$max_clients;$i++){ // for each client if(in_array($client[$i]['sock'] , $read)){ $input = socket_read($client[$i]['sock'] , 1024); eval($print_receive); if($input==null){ // Zero length string meaning disconnected unset($client[$i]); } $input = trim($input); if($input == 'exit'){ // requested disconnect socket_close($client[$i]['sock']); unset($client[$i]); }elseif($input=='shutdown'){ // shutdown server socket_close($client[$i]['sock']); unset($client[$i]); $running=0; }elseif($input){ // strip white spaces and write back to user //$output = ereg_replace("[ \t\n\r]","",$input).chr(0); //socket_write($client[$i]['sock'],$output); //eval($print_send); //$output = 'test'; //socket_write($client[$i]['sock'],$output); //eval($print_send); /* PROCESS CLIENT INPUT Send message to all clients: $output='message'; for($j=0;$j<$max_clients;$j++){ if($client[$j]['sock']){ socket_write($client[$j]['sock'], $output.chr(0)); eval($print_send); } } */ } //end input }else{ // Close the socket //socket_close($client[$i]['sock']); //unset($client[$i]); } }//end for } //end while // Close the master sockets socket_close($sock); echo "<br><font color=red>SHUTDOWN</font>"; ?> Quote Link to comment https://forums.phpfreaks.com/topic/55327-php-socket-server-cannot-send-message-to-the-client/ Share on other sites More sharing options...
owned Posted June 12, 2007 Author Share Posted June 12, 2007 Oops..i meant: Socket_select() might be the reason? (cant edit) Quote Link to comment https://forums.phpfreaks.com/topic/55327-php-socket-server-cannot-send-message-to-the-client/#findComment-273470 Share on other sites More sharing options...
TreeNode Posted June 12, 2007 Share Posted June 12, 2007 While asynchronous is meant to include both way of communication, the basic AJAX code will not allow for this, but there are a few frameworks that already do: http://www.trapets.com/page.jsp?node=559 The more realistic solution is to just stick with polling the server on a variable rate that does not affect your hardware, and upgrade when things get out of hand. Here's some more info: http://www.pushlets.com/doc/whitepaper-all.html Good luck, I would like to someday do this myself. I'm sure in a few years AJAX 2.0 will be server-side initiated requests. Quote Link to comment https://forums.phpfreaks.com/topic/55327-php-socket-server-cannot-send-message-to-the-client/#findComment-273473 Share on other sites More sharing options...
owned Posted June 12, 2007 Author Share Posted June 12, 2007 Well there is nothing ajax. Client program is not even web-browser. Attachment: client app, if anyone wants to try and help. ??? [attachment deleted by admin] Quote Link to comment https://forums.phpfreaks.com/topic/55327-php-socket-server-cannot-send-message-to-the-client/#findComment-273488 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.