nujs2000/websockets
Websockets
0.1.1
2019-08-04 15:28 UTC
Requires
- aeviiq/collection: ^2.0
- myclabs/php-enum: ^1.7
- psr/log: ^1.1
- react/socket: ^1.1
- symfony/event-dispatcher: ^3.4 || ^4.0
Requires (Dev)
- phpunit/phpunit: ^7.4
This package is auto-updated.
Last update: 2024-09-05 02:28:12 UTC
README
WebSocket服务器
几乎完全兼容https://tools.ietf.org/html/rfc6455
简单版本在此处可找到:https://mdn.org.cn/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers
数据帧格式
以下数据帧用于解析客户端的消息。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
操作码
映射
所有传入的帧都被映射到Frame类,这个类基本上是上面显示的数据帧的面向对象版本。以下映射被使用
FIN
=> Frame::isFinal(): boolRSV1
=> noneRSV2
=> noneRSV3
=> noneOPCODE
=> Frame::getOpcode(): intMASK
=> Frame::isMasked(): boolPAYLOAD_LENGTH
=> Frame::getPayloadLength(): intMASKING_KEY
=> Frame::getMaskingKey(): stringPAYLOAD_DATA
=> Frame::getPayload(): string
附加功能
为了方便使用,为Frame添加了一些函数
- Frame::isClosing(): bool => 当操作码 =
0x8
时为true - Frame::isControl(): bool => 当操作码是控制操作时为true
- Frame::isNonControl(): bool => 当操作码不是控制操作时为true
事件
WebSocket使用了symfony事件调度器。因此,每个传入的数据帧都会触发一个事件。此事件可以用来对传入的帧做出反应。以下是可以监听的事件列表
要触发所有事件,有4个事件调度器。以下调度器和它们的传入/传出事件列表
运行示例
此项目中包含一个简单的聊天应用程序。要运行,请使用以下命令
php example/socket.php php -S 127.0.0.1:8080 -t ./example/web
您必须分别运行这两个命令
已知问题
- 尚不支持分片
- 编码器的编码函数尚未支持掩码
- 由于缓冲区限制,无法接收超过65536个字符的字符串