我正在尝试为WebSockets编写自己的PHP服务器代码。服务器查看连接并接收最新版本的打开握手(8)。 到目前为止一切正常,握手工作,客户有牢固的联系。
接收邮件也可以正常工作,但是当我想回复客户端时,我的代码似乎无法正常工作。
我有以下服务器端代码向客户端发送消息:
public function write($data, $handshake = false) {
if ($handshake) {
socket_write($this->socket, $data.chr(0), strlen($data)+1);
} else {
socket_write($this->socket, chr(0).$data.chr(255), strlen($data)+2);
}
}
//Where $data is a JSON string
我相信部分是清楚的;第一个socket_write用于握手,另一个用于每个普通消息(例如除握手之外的所有消息)。
当我将第一条消息发送到客户端时,客户端断开连接(仅此客户端)。 我已经将chr(0)和chr(255)替换为几乎每个地方(在$ data之前,都在后面,前面/后面只有一个,等等),但似乎没有任何区别。
当我更改这些内容时,客户端不会断开连接,但也不会收到消息。
我希望你能把我送到正确的方向,因为我使用的最新WebSocket草案几乎没有内容:hybi-17。
谢谢!
修改: 以下是我必须使用的消息格式(请参阅Len Holgate的回复):
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 ... |
+---------------------------------------------------------------+
但是,我不知道如何构建它,因为我没有使用这样的图表的经验。一个小例子或基本解释会非常方便。
答案 0 :(得分:0)
基本的websocket协议框架在Hixie76草案和HyBi-17草案之间发生了很大的变化。规范如下:http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2
答案 1 :(得分:0)
我幸运地发现了一个非常有用的主题:PHP Websocket Server hybi10。 第二个答案有两个代码块,一个是客户端代码,另一个是服务器代码。我已经使用过服务器了,它没有任何问题。 确保不使用“.chr(0)”结束握手,因为这会断开客户端的连接。