Javascript 如果websocket握手成功完成,我是否应该在客户端中看到onopen事件?
首先,如果你能告诉我这里是否有问题:Javascript 如果websocket握手成功完成,我是否应该在客户端中看到onopen事件?,javascript,php,websocket,phpwebsocket,Javascript,Php,Websocket,Phpwebsocket,首先,如果你能告诉我这里是否有问题: 客户端: var ws = new WebSocket('ws://localhost:9090/websocket_server.php');// ws://echo.websocket.org/echo console.log(ws); ws.onopen = function(e) { console.log("Connection open...", e); ws.send("Hello WebSocket!"); }; ws.
客户端:
var ws = new WebSocket('ws://localhost:9090/websocket_server.php');// ws://echo.websocket.org/echo
console.log(ws);
ws.onopen = function(e) {
console.log("Connection open...", e);
ws.send("Hello WebSocket!");
};
ws.onmessage = function(e) {
if(typeof e.data === "string"){
console.log("String message received", e, e.data);
} else {
console.log("Other message received", e, e.data);
}
};
ws.onerror = function(e) {
console.log("WebSocket Error: " , e);
};
ws.onclose = function(e) {
console.log("Connection closed", e);
};
<?php
defined('KEY_SUFFIX') ? null : define('KEY_SUFFIX', "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, 'localhost', 9090);
socket_listen($sock);
while (true) {
$client = socket_accept($sock) or die('socket_accept returned false');;
//$buf = socket_read($client, 1024);
$buf = null;$key=null;
while ( $line = socket_read($client, 2048, PHP_NORMAL_READ) ) {
$buf .= $line;
if ( strpos($line, 'Sec-WebSocket-Key')!== false ) {
$key = substr($line, 19);
} else
if ( strpos($line, 'User-Agent')!== false ) {
break;
}
}
//echo $buf;
$sha1 = SHA1($key.KEY_SUFFIX, true);
$accept = base64_encode($sha1);
$write = "HTTP/1.1 101 Switching Protocols\n";
$write .= "Upgrade: websocket\n";
$write .= "connection: Upgrade\n";
$write .= "Sec-Websocket-Accept: $accept\n";
//$write .= "Sec-Websocket-Extensions: extension\n";
socket_write( $client, $write, strlen($write) );
}
socket_close($sock);
?>
服务器:
var ws = new WebSocket('ws://localhost:9090/websocket_server.php');// ws://echo.websocket.org/echo
console.log(ws);
ws.onopen = function(e) {
console.log("Connection open...", e);
ws.send("Hello WebSocket!");
};
ws.onmessage = function(e) {
if(typeof e.data === "string"){
console.log("String message received", e, e.data);
} else {
console.log("Other message received", e, e.data);
}
};
ws.onerror = function(e) {
console.log("WebSocket Error: " , e);
};
ws.onclose = function(e) {
console.log("Connection closed", e);
};
<?php
defined('KEY_SUFFIX') ? null : define('KEY_SUFFIX', "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, 'localhost', 9090);
socket_listen($sock);
while (true) {
$client = socket_accept($sock) or die('socket_accept returned false');;
//$buf = socket_read($client, 1024);
$buf = null;$key=null;
while ( $line = socket_read($client, 2048, PHP_NORMAL_READ) ) {
$buf .= $line;
if ( strpos($line, 'Sec-WebSocket-Key')!== false ) {
$key = substr($line, 19);
} else
if ( strpos($line, 'User-Agent')!== false ) {
break;
}
}
//echo $buf;
$sha1 = SHA1($key.KEY_SUFFIX, true);
$accept = base64_encode($sha1);
$write = "HTTP/1.1 101 Switching Protocols\n";
$write .= "Upgrade: websocket\n";
$write .= "connection: Upgrade\n";
$write .= "Sec-Websocket-Accept: $accept\n";
//$write .= "Sec-Websocket-Extensions: extension\n";
socket_write( $client, $write, strlen($write) );
}
socket_close($sock);
?>
我以这种方式运行php脚本:F:\xampp\php\php-qd:\websocket\u server.php
问题:
假设如果一切都正确,我一直在查看chrome调试器网络部分,它处于挂起状态,我希望在这个过程之后,我会在js控制台中看到一个onopen事件,
发生了什么事?我的预期错了吗?
在此过程之后,服务器和客户端之间的连接应该从0状态变为1状态,还是需要更多的工作才能建立打开状态?
我发现了问题:
错误:
1:读取导致第18行sec websocket accpet计算错误的sec websocket键行中的最后一个字符
2:不知道关于响应头的两件事:一是你需要在每一行的末尾放置
\r\n
,而不仅仅是\n
,第二是你需要在头的最后一行之后放置两个\r\n\r\n
,如果不是两行,它就不起作用。(行:30-33)现在,它在客户机中启动onopen事件
<?php
defined('KEY_SUFFIX') ? null : define('KEY_SUFFIX', "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, 'localhost', 9090);
socket_listen($sock);
while (true) {
$client = socket_accept($sock) or die('socket_accept returned false');;
//$buf = socket_read($client, 1024);
$buf = null;$key=null;
while ( $line = socket_read($client, 2048, PHP_NORMAL_READ) ) {
$buf .= $line;
if ( strpos($line, 'Sec-WebSocket-Key')!== false ) {
$key = substr($line, 19, 24); // <== mistake num 1 here
} else
if ( strpos($line, 'User-Agent')!== false ) {
break;
}
}
//echo $buf;
$sha1 = SHA1($key.KEY_SUFFIX, true);
$accept = base64_encode($sha1);
//mistake num 2 here
$write = "HTTP/1.1 101 Switching Protocols\r\n";
$write .= "Upgrade: websocket\r\n";
$write .= "connection: Upgrade\r\n";
$write .= "Sec-Websocket-Accept: $accept\r\n\r\n";
socket_write( $client, $write, strlen($write) );
}
socket_close($sock);
?>
我希望我能解释清楚。