我正在尝试使用http://code.google.com/p/phpwebsocket/上的phpwebsocket库 我正在使用server.php文件的版本r8。为了测试,我刚刚尝试使用client.html文件,也是由网站提供的。
当服务器启动时,我得到了这个:
Server Started : 2011-08-29 22:11:23
Master socket : Resource id #4
Listening on : www.midomain.com port 12345
但是当我在浏览器中加载client.html文件时,服务器会显示以下错误:
Notice: Undefined variable: key1 in /home/mink500/public_html/test/server.php on line 143
Notice: Undefined variable: key2 in /home/mink500/public_html/test/server.php on line 143
Warning: socket_select(): 5 is not a valid Socket resource in /home/mink500/public_html/test/server.php on line 15
有两个未定义的变量,函数socket_select()返回错误“5不是有效的套接字资源”
在浏览器中,我一加载文件就会收到“Disconnected”消息。
我尝试使用XAMPP(Apache和PHP)使服务器在本地工作,但我遇到了同样的错误。我还尝试更改端口并按照此问题中的说明进行操作:
http://code.google.com/p/phpwebsocket/issues/detail?id=33
但我仍然得到错误“5不是有效的Socket资源”
我记得几个月前我几次刷新页面,但是现在这是不可能的。此外,我需要它一直工作,而不是在我刷新页面20次之后。
我也尝试过websocket.class.php文件,但这次我在客户端遇到错误。浏览器现在返回“WebSocket握手期间出错:'Sec-WebSocket-Accept'标题丢失”。
所以,我无法使用旧的或新的文件,远程或本地服务器,魔法或ouija板!
有什么想法吗?
由于
答案 0 :(得分:2)
从最新的phpwebsocket client.html和server.php文件开始,我用以下代码替换了getheaders()和dohandshake()函数,这些函数适用于最新的Chrome。但是,在聊天框中发表评论后,它目前不会写入浏览器,也不会保持活跃状态。
function dohandshake($user, $buffer) {
$key = null;
console("\nRequesting handshake...");
console($buffer);
console("Handshaking...");
preg_match("#Sec-WebSocket-Key: (.*?)\r\n#", $buffer, $match) && $key = $match[1];
$key .= "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
$key = sha1($key);
$key = pack('H*', $key);
$key = base64_encode($key);
$upgrade =
"HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: {$key}\r\n\r\n";
socket_write($user->socket, $upgrade . chr(0), strlen($upgrade . chr(0)));
$user->handshake = true;
console($upgrade);
console("Done handshaking...");
return true;
}
function getheaders($header) {
$retVal = array();
$fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header));
foreach ($fields as $field) {
if (preg_match('/([^:]+): (.+)/m', $field, $match)) {
$match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
if (isset($retVal[$match[1]])) {
$retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
} else {
$retVal[$match[1]] = trim($match[2]);
}
}
}
if (preg_match("/GET (.*) HTTP/", $header, $match)) {
$retVal['GET'] = $match[1];
}
return $retVal;
}