我目前正在开发一个必须实现网络套接字服务器的网站。我正在使用PHP来制作服务器。我从客户端响应中提取了Sec-websocket-key
,然后使用PHP sha1()
命令对其进行了哈希处理。
问题在于,当我想要base64_encode
时,它会给出一个错误的接受键。 base64_encode
命令有变化吗?
感谢您的回答!
这只是一个测试代码,它不允许多个客户端:
$address = "127.0.0.1";
$port = 9000;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port);
socket_listen($sock);
$client = socket_accept($sock);
$handshake = Array();
$response = socket_read($client, 1024);
$handshake = split("\r\n", $response);
$socketKey = split(" ", $handshake[11]);
$rawAccept = socketKey[1] . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
$rawAccept = str_replace(" ", "", $rawAccept);
$rawSha1Accept = sha1($rawAccept);
$accept = base64_encode($rawSha1Accept);
$upgrade = "HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: $accept\r\n\r\n";
socket_write($client, $upgrade, 1024);
答案 0 :(得分:0)
我认为错误可能就在这一行:
$rawAccept = socketKey[1] . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
我认为socketKey [1]应该只是socketKey,但是我在下面编写了一些未经测试的代码,它们可以帮助您了解如何获取密钥并创建正确的接受密钥。
$address = "127.0.0.1";
$port = 9000;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port);
socket_listen($sock);
$client = socket_accept($sock);
$response = socket_read($client, 1024);
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $response, $match))
{
$key = $match[1];
}
$sha = sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true);
$acccept = base64_encode($sha);
$upgrade = "HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: $accept\r\n\r\n";
socket_write($client, $upgrade, 1024);
答案 1 :(得分:0)
函数sha1()
已经对哈希值进行编码,因此您应该在编码之前计算二进制哈希:
$rawSha1Accept = sha1($rawAccept, true); // Note the second parameter
$accept = base64_encode($rawSha1Accept);