<?php
require 'MIO/Selector.php';
require 'MIO/SelectionKey.php';
require 'MIO/Stream.php';
require 'MIO/StreamFactory.php';
require 'MIO/Exception.php';
/**
* Message generator class for spewing out different data
*
*/
class MessageGen
{
private $count=0;
public function getMessage()
{
switch( $this->count ) {
case 0:
$message = "My first is in tea but not in leaf";
break;
case 1:
$message = "My second is in teapot and also in teeth";
break;
case 2:
$message = "My third is in caddy but not in cosy";
break;
case 3:
$message = "My fourth is in cup but not in rosy";
break;
case 4:
$message = "My fifth is in herbal and also in health";
break;
case 5:
$message = "My last is in drink, so what can I be";
break;
case 6:
$message = "I'm there in a classroom, do you listen to me?";
break;
default:
return false;
}
return $message;
}
public function inc()
{
$this->count++;
}
}
/**
* Echo class for responding to data
*/
class EchoGen
{
private $message = '';
public function put( $message )
{
$this->message = $message;
}
public function get()
{
return "The message is: " . $this->message;
}
}
$selector = new MioSelector();
$streams = new MioStreamFactory();
echo "Creating server...";
$selector->register(
$streams->createServerStream( '127.0.0.1:8888' ),
MioSelectionKey::OP_ACCEPT
);
echo "DONE\n";
$i=0;
while( true ) {
/**
* Add socket streams five at a time otherwise the server
* buffer gets filled up and fsockopen blocks
*/
for( $j=0; $j<5 && $i<100; $i++, $j++ ) {
echo "Creating client " . ($i+1) . "...";
$selector->register(
$streams->createSocketStream( '127.0.0.1', 8888 ),
MioSelectionKey::OP_WRITE,
new MessageGen()
);
echo "DONE\n";
}
while( !$count = $selector->select() ) {
if( $count === false || ($count===0 && count( $selector->selection_keys )==1)) {
$selector->close();
break 2;
}
}
foreach( $selector->selected_keys as $key ) {
if( $key->isAcceptable() ) {
while( $stream = $key->stream->accept() ) {
$selector->register(
$stream,
MioSelectionKey::OP_READ,
new EchoGen()
);
}
} elseif( $key->isReadable() ) {
$data = $key->stream->read( 4096 );
if( $key->attachment instanceof EchoGen ) {
$key->attachment->put( $data );
} elseif( $key->attachment instanceof MessageGen ) {
if( !preg_match( '/(The message.*)/', $data, $matches )) {
echo $key->stream . " BAD MATCH\n";
echo $data . "\n";
} else {
echo $key->stream . ' ' . $matches[1] . "\n";
}
} else {
throw new Exception( "Invalid attachment type" );
}
$key->setInterestOps( MioSelectionKey::OP_WRITE );
} elseif( $key->isWritable() ) {
if( $key->attachment instanceof EchoGen ) {
$data = $key->attachment->get();
} elseif( $key->attachment instanceof MessageGen ) {
if( $data = $key->attachment->getMessage() ) {
$key->attachment->inc();
echo $key->stream . " Sending: " . $data . "\n";
} else {
echo $key->stream . " Remove Stream (" . count( $selector->selection_keys ) . ")\n";
$selector->removeKey( $key );
continue;
}
}
$key->stream->write( $data );
$key->setInterestOps( MioSelectionKey::OP_READ );
}
}
flush();
}
|