在PHP中如何实现WebSocket握手?

问题描述:

我正在尝试编写一段代码,它将为web套接字连接生成Sec-WebSocket-Accept值。我从收集资源在线(即MDN)是你:在PHP中如何实现WebSocket握手?

  1. 将字符串,客户端送你Sec-WebSocket-Key到GUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11);

  2. 取这个串联结果的SHA-1散列;

  3. 转换的,其结果基地64

所以,如果我理解正确此,相应的PHP代码如下:

base64_encode(sha1($sec-websocket-key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11")); 

然而,这是不正确的。它与MDN上显示的示例不匹配(即,在MDN上,值为dGhlIHNhbXBsZSBub25jZQ==的WebSocket密钥应返回s3pPLMBiTxaQ9kYGzzhZRbK+xOo=,但使用我编写的PHP代码,它返回YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==)。

我在这里做了什么不对?

sha1()函数接受一个可选的第二个布尔参数,它使用20个字符的二进制形式(而不是40个字符的十六进制形式)返回原始SHA-1摘要(请参阅PHP Manual)。

WebSocket握手需要原始二进制格式。因此,您需要将第二个参数添加到sha1()函数中。

base64_encode(sha1($sec-websocket-key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true)); 
+0

这就解决了这个问题。谢谢。 – Toastrackenigma