我有一个PHP服务器,它绑定到一个端口并侦听套接字。我的服务器是在一个PHP脚本中启动的,其中包含:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, 0, $port);
然后它监听端口:
socket_listen($socket);
当HTTP消息从客户端到达时,服务器读取标题:
$header = socket_read($socket_new,1024);
然后将该连接存储在Memcache存储器中。这适用于大多数浏览器,包括safari、firefox和Chrome的Canary。然而,它在铬上不起作用。浏览器抛出错误消息:
到"ws://xyz.com:9001/chat_server.php"的WebSocket连接失败:WebSocket握手过程中出错:不正确"Sec WebSocket Accept"标头值
我的Chrome版本是:38.0.2125.111 m(64位)
我们遇到了同样的问题,我们可以通过增加socket_read()函数中的"最大字节数"参数来解决它。你可以试试
socket_tead($socket_new, 2048);
原因是chrome中的websocket标头有时大于1024字节。因此,当您的服务器读取1024字节时,它不会获得Sec-Websocket-Key参数,也无法生成有效的Sec-Web套接字Accept值。
您也可以使用fsockopen()和fread()来代替socket_read()函数。