【发布时间】:2021-01-09 16:00:12
【问题描述】:
我正在尝试制作我的小型 websocket php 类,我想在其中制作诸如 onopen onmessage 之类的功能,例如 node js [我知道那里还有其他库,但我想自己学习它]。到目前为止我能够使用下面的代码成功接收从 js websocket 到 php 的消息
<?php
$host = "localhost";
$port = 8001;
$sockets=array();
function sendAll($connections,$msg){
foreach ($connections as $each) {
send($each,$msg);
}
}
function send($client,$msg){
$msg = chr(129) . chr(strlen($msg)) . $msg;
socket_write($client,$msg,strlen($msg));
}
function handshake($client){
$request = socket_read($client, 5000);
preg_match('#Sec-WebSocket-Key: (.*)\r\n#', $request, $matches);
$key = base64_encode(pack(
'H*',
sha1($matches[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
));
$headers = "HTTP/1.1 101 Switching Protocols\r\n";
$headers .= "Upgrade: websocket\r\n";
$headers .= "Connection: Upgrade\r\n";
$headers .= "Sec-WebSocket-Version: 13\r\n";
$headers .= "Sec-WebSocket-Accept: $key\r\n\r\n";
socket_write($client, $headers, strlen($headers));
}
// Create WebSocket.
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_nonblock($server);
socket_bind($server, $host, $port);
socket_listen($server);
while(true){
$client = socket_accept($server);
if($client != false){
usleep(100);
handshake($client);
array_push($sockets,$client);
print_r($sockets);
}
else{
if(count($sockets) > 0){
foreach ($sockets as $each) {
$msg = socket_read($each,5000);
if($msg != false){
filter($msg);
// send($each,"testing");
}
}
}
}
}
function filter($msg){
$msg = unpack("c*",$msg);
foreach ($msg as $value) {
echo chr($value);
}
// print_r($msg);
}
?>
经过一些研究,我发现 websocket 以二进制形式发送消息。我无法将该消息转换为纯文本。我不知道数据发送到哪种语言或格式。请告诉我它是哪种格式以及如何将其读取为下面的纯文本示例图片
【问题讨论】:
标签: javascript php websocket phpwebsocket