diff --git a/docs/Server.md b/docs/Server.md index a44a1ac..9e12e07 100644 --- a/docs/Server.md +++ b/docs/Server.md @@ -35,7 +35,7 @@ WebSocket\Server { public getRemoteName() : string|null; public getLastOpcode() : string; public getCloseStatus() : int; - public isConnected() : bool + public isConnected() : bool; public setTimeout(int $seconds) : void; public setFragmentSize(int $fragment_size) : self; public getFragmentSize() : int; diff --git a/examples/echoserver.php b/examples/echoserver.php index 3f7db53..a85e564 100644 --- a/examples/echoserver.php +++ b/examples/echoserver.php @@ -32,7 +32,7 @@ echo "> Using logger\n"; } -// Initiate server +// Initiate server. try { $server = new Server($options); } catch (ConnectionException $e) { @@ -42,58 +42,46 @@ echo "> Listening to port {$server->getPort()}\n"; -$server->listen(function ($message, $connection = null) use ($server) { - $content = $message->getContent(); - $opcode = $message->getOpcode(); - $peer = $connection ? $connection->getPeer() : '(closed)'; - echo "> Got '{$content}' [opcode: {$opcode}, peer: {$peer}]\n"; - - // Connection closed, can't respond - if (!$connection) { - echo "> Connection closed\n"; - return; // Continue listening - } - - if (in_array($opcode, ['ping', 'pong'])) { - $connection->text($content); - echo "< Sent '{$content}' [opcode: text, peer: {$peer}]\n"; - return; // Continue listening +// Force quit to close server +while (true) { + try { + while ($server->accept()) { + echo "> Accepted on port {$server->getPort()}\n"; + while (true) { + $message = $server->receive(); + $opcode = $server->getLastOpcode(); + if (is_null($message)) { + echo "> Closing connection\n"; + continue 2; + } + echo "> Got '{$message}' [opcode: {$opcode}]\n"; + if (in_array($opcode, ['ping', 'pong'])) { + $server->send($message); + continue; + } + // Allow certain string to trigger server action + switch ($message) { + case 'exit': + echo "> Client told me to quit. Bye bye.\n"; + $server->close(); + echo "> Close status: {$server->getCloseStatus()}\n"; + exit; + case 'headers': + $server->text(implode("\r\n", $server->getRequest())); + break; + case 'ping': + $server->ping($message); + break; + case 'auth': + $auth = $server->getHeader('Authorization'); + $server->text("{$auth} - {$message}"); + break; + default: + $server->text($message); + } + } + } + } catch (ConnectionException $e) { + echo "> ERROR: {$e->getMessage()}\n"; } - - // Allow certain string to trigger server action - switch ($content) { - case 'auth': - $auth = "{$server->getHeader('Authorization')} - {$content}"; - $connection->text($auth); - echo "< Sent '{$auth}' [opcode: text, peer: {$peer}]\n"; - break; - case 'close': - $connection->close(1000, $content); - echo "< Sent '{$content}' [opcode: close, peer: {$peer}]\n"; - break; - case 'exit': - echo "> Client told me to quit.\n"; - $server->close(); - return true; // Stop listener - case 'headers': - $headers = trim(implode("\r\n", $server->getRequest())); - $connection->text($headers); - echo "< Sent '{$headers}' [opcode: text, peer: {$peer}]\n"; - break; - case 'ping': - $connection->ping($content); - echo "< Sent '{$content}' [opcode: ping, peer: {$peer}]\n"; - break; - case 'pong': - $connection->pong($content); - echo "< Sent '{$content}' [opcode: pong, peer: {$peer}]\n"; - break; - case 'stop': - $server->stop(); - echo "> Client told me to stop listening.\n"; - break; - default: - $connection->text($content); - echo "< Sent '{$content}' [opcode: text, peer: {$peer}]\n"; - } -}); +}