Cleanup send code in WebSocketConnection
This commit is contained in:
parent
9e1b2fcbae
commit
c855fc177f
16
doc/ConnectionGroups.md
Normal file
16
doc/ConnectionGroups.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# ConnectionGroups
|
||||||
|
|
||||||
|
Often websocket connections share a context. This could be a room for a chat, an URI for pushing updates, or anything else where one client need to be able to send messages directly or indirectly to other clients. This is the problem that *ConnectionGroups* solve.
|
||||||
|
|
||||||
|
A `WebSocketConnection` can, but doesn't have to, be part of a group. The group is set using `WebSocketConnection::setGroup(string $name)` with groups being created and destroyed on the fly. Once part of a group, the other members of the group can be addressed:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$websocket->setGroup("somename");
|
||||||
|
|
||||||
|
// Note: use getGroupName() to get the group name
|
||||||
|
foreach ($websocket->getGroup() as $other) {
|
||||||
|
$other->write("Hello");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To remove a group from a connection, call `setGroup(null)`.
|
@ -214,25 +214,28 @@ class WebSocketConnection implements WebSocketInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function write($data)
|
public function write($data)
|
||||||
{
|
{
|
||||||
// Header; final, text frame, unmasked
|
return $this->send(self::OP_FRAME_TEXT, $data);
|
||||||
$frame = chr(0x81) . chr(strlen($data)) . $data;
|
|
||||||
|
|
||||||
$this->outStream->write($frame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function send(int $opcode, bool $final, string $data)
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function send(int $opcode, string $data, bool $final = true)
|
||||||
{
|
{
|
||||||
$frame = chr(($final?0x80:0x00) | ($opcode & 0xF));
|
$frame = chr(($final?0x80:0x00) | ($opcode & 0xF));
|
||||||
|
|
||||||
$len = strlen($data);
|
$len = strlen($data);
|
||||||
if ($len > 126) {
|
if ($len > 126) {
|
||||||
$frame .= chr(0x7E) . chr(($len >> 8) & 0xFF) . chr($len & 0xFF);
|
$frame .= chr(0x7E) . chr(($len >> 8) & 0xFF) . chr($len & 0xFF);
|
||||||
|
} else {
|
||||||
|
$frame .= chr($len);
|
||||||
}
|
}
|
||||||
$frame .= $data;
|
$frame .= $data;
|
||||||
|
|
||||||
$this->outStream->write($frame);
|
$this->outStream->write($frame);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function close()
|
public function close()
|
||||||
@ -245,5 +248,25 @@ class WebSocketConnection implements WebSocketInterface
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// private function hexdump($data): void
|
||||||
|
// {
|
||||||
|
// printf("%4d .\n", strlen($data));
|
||||||
|
// $rows = str_split($data, 16);
|
||||||
|
// $offs = 0;
|
||||||
|
// foreach ($rows as $row) {
|
||||||
|
// $h = []; $a = [];
|
||||||
|
// for ($n = 0; $n < 16; $n++) {
|
||||||
|
// if ($n < strlen($row)) {
|
||||||
|
// $h[] = sprintf("%02x%s", ord($row[$n]), ($n==7)?" ":" ");
|
||||||
|
// $a[] = sprintf("%s%s", (ctype_print($row[$n])?$row[$n]:"."), ($n==7)?" ":"");
|
||||||
|
// } else {
|
||||||
|
// $h[] = (($n==7)?" ":" ");
|
||||||
|
// $a[] = (($n==7)?" ":" ");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// printf("%04x | %s | %s\n", 16 * $offs++, join("", $h), join("", $a));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user