|
32 | 32 | echo "> Using logger\n";
|
33 | 33 | }
|
34 | 34 |
|
35 |
| -// Initiate server |
| 35 | +// Initiate server. |
36 | 36 | try {
|
37 | 37 | $server = new Server($options);
|
38 | 38 | } catch (ConnectionException $e) {
|
|
42 | 42 |
|
43 | 43 | echo "> Listening to port {$server->getPort()}\n";
|
44 | 44 |
|
45 |
| -$server->listen(function ($message, $connection = null) use ($server) { |
46 |
| - $content = $message->getContent(); |
47 |
| - $opcode = $message->getOpcode(); |
48 |
| - $peer = $connection ? $connection->getPeer() : '(closed)'; |
49 |
| - echo "> Got '{$content}' [opcode: {$opcode}, peer: {$peer}]\n"; |
50 |
| - |
51 |
| - // Connection closed, can't respond |
52 |
| - if (!$connection) { |
53 |
| - echo "> Connection closed\n"; |
54 |
| - return; // Continue listening |
55 |
| - } |
56 |
| - |
57 |
| - if (in_array($opcode, ['ping', 'pong'])) { |
58 |
| - $connection->text($content); |
59 |
| - echo "< Sent '{$content}' [opcode: text, peer: {$peer}]\n"; |
60 |
| - return; // Continue listening |
| 45 | +// Force quit to close server |
| 46 | +while (true) { |
| 47 | + try { |
| 48 | + while ($server->accept()) { |
| 49 | + echo "> Accepted on port {$server->getPort()}\n"; |
| 50 | + while (true) { |
| 51 | + $message = $server->receive(); |
| 52 | + $opcode = $server->getLastOpcode(); |
| 53 | + if (is_null($message)) { |
| 54 | + echo "> Closing connection\n"; |
| 55 | + continue 2; |
| 56 | + } |
| 57 | + echo "> Got '{$message}' [opcode: {$opcode}]\n"; |
| 58 | + if (in_array($opcode, ['ping', 'pong'])) { |
| 59 | + $server->send($message); |
| 60 | + continue; |
| 61 | + } |
| 62 | + // Allow certain string to trigger server action |
| 63 | + switch ($message) { |
| 64 | + case 'exit': |
| 65 | + echo "> Client told me to quit. Bye bye.\n"; |
| 66 | + $server->close(); |
| 67 | + echo "> Close status: {$server->getCloseStatus()}\n"; |
| 68 | + exit; |
| 69 | + case 'headers': |
| 70 | + $server->text(implode("\r\n", $server->getRequest())); |
| 71 | + break; |
| 72 | + case 'ping': |
| 73 | + $server->ping($message); |
| 74 | + break; |
| 75 | + case 'auth': |
| 76 | + $auth = $server->getHeader('Authorization'); |
| 77 | + $server->text("{$auth} - {$message}"); |
| 78 | + break; |
| 79 | + default: |
| 80 | + $server->text($message); |
| 81 | + } |
| 82 | + } |
| 83 | + } |
| 84 | + } catch (ConnectionException $e) { |
| 85 | + echo "> ERROR: {$e->getMessage()}\n"; |
61 | 86 | }
|
62 |
| - |
63 |
| - // Allow certain string to trigger server action |
64 |
| - switch ($content) { |
65 |
| - case 'auth': |
66 |
| - $auth = "{$server->getHeader('Authorization')} - {$content}"; |
67 |
| - $connection->text($auth); |
68 |
| - echo "< Sent '{$auth}' [opcode: text, peer: {$peer}]\n"; |
69 |
| - break; |
70 |
| - case 'close': |
71 |
| - $connection->close(1000, $content); |
72 |
| - echo "< Sent '{$content}' [opcode: close, peer: {$peer}]\n"; |
73 |
| - break; |
74 |
| - case 'exit': |
75 |
| - echo "> Client told me to quit.\n"; |
76 |
| - $server->close(); |
77 |
| - return true; // Stop listener |
78 |
| - case 'headers': |
79 |
| - $headers = trim(implode("\r\n", $server->getRequest())); |
80 |
| - $connection->text($headers); |
81 |
| - echo "< Sent '{$headers}' [opcode: text, peer: {$peer}]\n"; |
82 |
| - break; |
83 |
| - case 'ping': |
84 |
| - $connection->ping($content); |
85 |
| - echo "< Sent '{$content}' [opcode: ping, peer: {$peer}]\n"; |
86 |
| - break; |
87 |
| - case 'pong': |
88 |
| - $connection->pong($content); |
89 |
| - echo "< Sent '{$content}' [opcode: pong, peer: {$peer}]\n"; |
90 |
| - break; |
91 |
| - case 'stop': |
92 |
| - $server->stop(); |
93 |
| - echo "> Client told me to stop listening.\n"; |
94 |
| - break; |
95 |
| - default: |
96 |
| - $connection->text($content); |
97 |
| - echo "< Sent '{$content}' [opcode: text, peer: {$peer}]\n"; |
98 |
| - } |
99 |
| -}); |
| 87 | +} |
0 commit comments