#!/usr/local/bin/php-cli -q
<?php
/**
 * simple example that implements a talkback.
 *
 * Normally this should be a bit more code and in a separate file
 *
 * @category    Networking
 * @package     Net_Server
 * @subpackage  Examples
 * @author      Stephan Schmidt <schst@php.net>
 */

/**
* server base class
*/
require_once 'ext/Server.php';

/**
* base class for the handler
*/
require_once 'ext/Server/Handler.php';

/**
 * simple example that implements a talkback.
 *
 * Normally this should be a bit more code and in a separate file
 *
 * @category    Networking
 * @package     Net_Server
 * @subpackage  Examples
 * @author      Stephan Schmidt <schst@php.net>
 */
class Net_Server_Handler_Talkback extends Net_Server_Handler
{
    var 
$clientStatus = array();
   
/**
    * onConnect handler
    *
    * @access public
    * @param  integer   $clientId   unique id of the client, in Net_Server_Fork, this is always 0
    */
    
function onConnect($clientId 0)
    {
        
$this->setClientStatus$clientId );
        
$this->_server->sendData$clientId"Hello. This is hoge Service. Your clientId is {$clientId}.'quit' to exit\r\n" );
        
$this->_server->broadcastDataToNeighbors$clientId"\r\nclient {$clientId} entry!!\r\n" );
//        $this->_server->sendData( $this->_server->getEndCharacter("") );
    
}
    
   
/**
    * If the user sends data, send it back to him
    *
    * @access   public
    * @param    integer $clientId
    * @param    string  $data
    */
    
function onReceiveData($clientId 0$data '')
    {
        
$client $this->getClientStatus$clientId );
        
        
$data trim($data);
        if(
$data=='') return;
        switch( 
$data ){
            case 
"close":
            case 
"exit":
            case 
"quit":
                
$this->_server->closeConnection$clientId );
                break;
            default:
                
$data htmlspecialchars$data );
                
$html = <<<HTML
<span style="color:{$client->color}">client {$clientId} said: $data</span>
HTML;
                
                
$this->_server->broadcastData$html );
                break;
        }
    }

   
/**
    * No data have been sent since $numberOfSeconds defined by
    * setIdleTimeout().
    * @access   public
    */
    
function onIdle()
    {
        
$this->_server->sendData0,  "Please say something!\r\n");
    }


   
/**
    * onClose handler
    *
    * @access public
    * @param  integer   $clientId   unique id of the client, in Net_Server_Fork, this is always 0
    */
    
function onClose($clientId 0)
    {
        
$this->_server->sendData$clientId"Bye!\r\n");
    }

    
/*
     *
     *
     */
    
function setClientStatus$clientId ){
        if( isset( 
$this->clientStatus$clientId ] ) ) return;
        
$this->clientStatus$clientId ] = new clientStatus();
    }
    
    function 
getClientStatus$clientId ){
        return 
$this->clientStatus$clientId ];
    }
}

class 
clientStatus
{
    var 
$name;
    var 
$color;
    
    function 
__construct()
    {
        
$this->color sprintf"#%02X%02X%02X"mt_rand0255 ), mt_rand0255 ) ,mt_rand0255 ) ) ;
    }
}

// create a server that forks new processes
$server = &Net_Server::create('Multiprocess'09090);
//$server = &Net_Server::create('Sequential', 0, 9090);
// you won't need this in most cases.
//$server->setIdleTimeout(10);

require_once("PEAR.php");
if (
PEAR::isError($server)) {
    die ( 
"error:".$server->getMessage()."\n" );
}

$handler = &new Net_Server_Handler_Talkback();

// hand over the object that handles server events
$server->setStartPool);
$server->setMaxIdle15 );
$server->setMaxClients); // process per client
$server->setCallbackObject($handler);
$server->readBufferSize 2048;
$server->readEndCharacter "\r\n";
$server->_debug false;

// start the server
$server->start();
?>