/** * @covers React\Socket\Connection::getRemoteAddress */ public function testGetRemoteAddress() { $loop = new StreamSelectLoop(); $server = new Server($loop); $server->listen(0); $class = new \ReflectionClass('React\\Socket\\Server'); $master = $class->getProperty('master'); $master->setAccessible(true); $client = stream_socket_client('tcp://localhost:' . $server->getPort()); $class = new \ReflectionClass('React\\Socket\\Connection'); $method = $class->getMethod('parseAddress'); $method->setAccessible(true); $servConn = new Connection($server->master, $loop); $mock = $this->expectCallableOnceWith($method->invokeArgs($servConn, array(stream_socket_get_name($master->getValue($server), false)))); $server->on('connection', function ($conn) use($mock) { $mock($conn->getRemoteAddress()); }); $loop->tick(); }
// sent for each connection and will print the average throughput once the // connection closes. // // $ php examples/03-benchmark.php 8000 // $ telnet localhost 8000 // $ echo hello world | nc -v localhost 8000 // $ dd if=/dev/zero bs=1M count=1000 | nc -v localhost 8000 use React\EventLoop\Factory; use React\Socket\Server; use React\Socket\ConnectionInterface; require __DIR__ . '/../vendor/autoload.php'; $loop = Factory::create(); $server = new Server($loop); $server->listen(isset($argv[1]) ? $argv[1] : 0); $server->on('connection', function (ConnectionInterface $conn) use($loop) { echo '[connected]' . PHP_EOL; // count the number of bytes received from this connection $bytes = 0; $conn->on('data', function ($chunk) use(&$bytes) { $bytes += strlen($chunk); }); // report average throughput once client disconnects $t = microtime(true); $conn->on('close', function () use($conn, $t, &$bytes) { $t = microtime(true) - $t; echo '[disconnected after receiving ' . $bytes . ' bytes in ' . round($t, 3) . 's => ' . round($bytes / $t / 1024 / 1024, 1) . ' MiB/s]' . PHP_EOL; }); }); $server->on('error', 'printf'); echo 'bound to ' . $server->getPort() . PHP_EOL; $loop->run();
use React\EventLoop\Factory; use React\Socket\Server; use React\Socket\ConnectionInterface; require __DIR__ . '/../vendor/autoload.php'; $loop = Factory::create(); $server = new Server($loop); $server->listen(isset($argv[1]) ? $argv[1] : 0, '0.0.0.0'); $clients = array(); $server->on('connection', function (ConnectionInterface $client) use(&$clients) { // keep a list of all connected clients $clients[] = $client; $client->on('close', function () use($client, &$clients) { unset($clients[array_search($client, $clients)]); }); // whenever a new message comes in $client->on('data', function ($data) use($client, &$clients) { // remove any non-word characters (just for the demo) $data = trim(preg_replace('/[^\\w\\d \\.\\,\\-\\!\\?]/u', '', $data)); // ignore empty messages if ($data === '') { return; } // prefix with client IP and broadcast to all connected clients $data = $client->getRemoteAddress() . ': ' . $data . PHP_EOL; foreach ($clients as $client) { $client->write($data); } }); }); echo 'Listening on ' . $server->getPort() . PHP_EOL; $loop->run();
<?php use React\EventLoop\Factory; use React\Socket\Server; use React\Http\Request; use React\Http\Response; require __DIR__ . '/../vendor/autoload.php'; $loop = Factory::create(); $socket = new Server($loop); $server = new \React\Http\Server($socket); $server->on('request', function (Request $request, Response $response) { $response->writeHead(200, array('Content-Type' => 'text/plain')); $response->end("Hello world!\n"); }); $socket->listen(isset($argv[1]) ? $argv[1] : 0, '0.0.0.0'); echo 'Listening on ' . $socket->getPort() . PHP_EOL; $loop->run();