2011-11-28 146 views
1

我试图编写我自己的Web服务器的PHP服务器。服务器看到连接并接收最新版本的开放握手(8)。 目前为止一切正常,握手正在工作,客户端有一个牢固的连接。如何格式化WebSocket hybi-17消息?

接收邮件也可以正常工作,但是当我想回复客户端时,我的代码似乎不起作用。

我有以下服务器端代码将消息发送到客户端:

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。

谢谢!

编辑: 下面是消息格式我必须使用(见莱恩霍尔盖特的答复):

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

这里我已经发布了一些关于这个主题的伪代码:http://stackoverflow.com/questions/8125507/how-can-i-send-and-receive-websocket-messages-on-the-server-side 。 – pimvdb

回答

0

我幸运地找到了一个真正有用的线程:PHP Websocket Server hybi10。 第二个答案有两个代码块,一个客户端和一个服务器。我已经使用了服务器,它没有任何问题。 确保您不会以“.chr(0)”结束握手,因为这会断开客户端连接。