我正在PHP中製作一個簡單的WebSocket服務器。我的websocket客戶端連接到它很好,但任何時候我嘗試通過它發送數據,我得到一個「錯誤:INVALID_STATE_ERR:DOM異常11」引發的JavaScript。WebSocket握手不工作
This和其他一些問題似乎描述了我遇到的同樣的問題,但WebSocket協議已經改變。
我假設問題是,我的腳本握手不正確,如該問題所述。我使用的是Chromium 15,它使用的WebSocket版本8
這是我握手功能(部分我的代碼從一個過時的例子,我發現某處部分修改):
function dohandshake($user, $buffer)
{
server_log(1, 'Requesting handshake...');
// Determine which version of the WebSocket protocol the client is using
if(preg_match("/Sec-WebSocket-Version: (.*)\r\n/ ", $buffer, $match))
$version = $match[1];
else
return false;
if($version == 8)
{
// Extract header variables
if(preg_match("/GET (.*) HTTP/" ,$buffer,$match)){ $r=$match[1]; }
if(preg_match("/Host: (.*)\r\n/" ,$buffer,$match)){ $h=$match[1]; }
if(preg_match("/Sec-WebSocket-Origin: (.*)\r\n/",$buffer,$match)){ $o=$match[1]; }
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$buffer,$match)){ $k = $match[1]; }
// Generate our Socket-Accept key based on the IETF specifications
$accept_key = $k . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
$accept_key = sha1($accept_key, true);
$accept_key = base64_encode($accept_key);
$upgrade = "HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: $accept_key";
socket_write($user->socket, $upgrade, strlen($upgrade));
$user->handshake = true;
return true;
}
else
{
server_log("Client is trying to use an unsupported WebSocket protocol ({$version})");
return false;
}
}
我測試的密鑰生成代碼的幾個我發現的例子,它似乎已經根據這些示例返回了正確的密鑰
敢問我爲什麼地球上你正在寫一個(希望)高度可用的PHP服務器?? :) –
因爲我可以:)(好吧,我發佈這個問題的事實可能意味着我只能說這不是重點) – DWilliams