nujs2000/websockets

0.1.1 2019-08-04 15:28 UTC

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(): bool
  • RSV1 => none
  • RSV2 => none
  • RSV3 => none
  • OPCODE => Frame::getOpcode(): int
  • MASK => Frame::isMasked(): bool
  • PAYLOAD_LENGTH => Frame::getPayloadLength(): int
  • MASKING_KEY => Frame::getMaskingKey(): string
  • PAYLOAD_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

您必须分别运行这两个命令

已知问题

  1. 尚不支持分片
  2. 编码器的编码函数尚未支持掩码
  3. 由于缓冲区限制,无法接收超过65536个字符的字符串