【发布时间】:2017-05-07 08:07:02
【问题描述】:
为了在 ssl 中完成 Websockets 的握手,必须以阻塞模式读取套接字。使用流套接字,使用fwrite() 和fgets() 从php 后端与(javascript)客户端进行通信。在阻塞模式下,fgets() 会等到下一行进来,然后抢一行。建立套接字连接后,客户端会向 PHP 发送一些标头,以便完成握手。问题是,我想不出一种方法来找到标题末尾的位置,因为顺序取决于所使用的浏览器。
我将这项工作用于 chrome(因为 sec-websocket-extensions 行是发送的最后一个标头)
stream_set_blocking($lsSocketNew, true);
$lcHeader = "";
while($lcLine = fgets($lsSocketNew)){
$lcHeader .= $lcLine;
if(strstr($lcLine, "Sec-WebSocket-Extensions")){
break;
}
}
但这在其他浏览器(如 firefox)中不起作用,此标头是第一个发送的标头。 :P
(我认为fread() 应该做我正在寻找的事情——在阻塞模式下,当它进入时它应该在套接字上获取“所有内容”......但是当我尝试使用 fread 时,它是返回一个空白字符串。:P stream_get_contents() 是一样的)
【问题讨论】:
标签: php sockets websocket stream