WebSocket (PHP) неправильная отправка кодировки с клиента (JS) - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь сделать WebSocket с PHP. И Клиент является приложением javascript. Я могу отправить данные из WebSocket клиенту. Но если я попытаюсь отправить информацию с Клиента на Сервер, сообщение будет выглядеть так: « @ u¹ ‰; WØë # Wƒ«! Ï «=". Я пытался json_decode / strval, но это не работает. Я также пытался в Javascript отправлять нормально с (socket.send ("abc")). и JSON objectsocket.send (JSON.stringify ({"abc": "abv")));

Вот код php:

<?php
/**
 * Created by PhpStorm.
 * User: rfur
 * Date: 07.09.2018
 * Time: 09:23
 */
// not my code
$address = '10.10.20.212';
$port = 1414;
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, $address, $port);
socket_listen($server);
$client = socket_accept($server);
$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));

while (true) {
    sleep(1);
    $content = 'Now: ' . time();
    $response = chr(129) . chr(strlen($content)) . $content;
    socket_write($client, $response);
    echo "socket_read: " . socket_read($client ,1024) . "\n";
    socket_write($client, $response);
    echo "var_dump socket_read: " . var_dump(socket_read($client,1024)) . 
    socket_write($client, $response);"\n";
    echo "json_decode socket_read: " . json_decode(socket_read($client,1024)) . "\n";
    socket_write($client, $response);
    echo "var_dump json_decode socket_read: " . var_dump(json_decode(socket_read($client,1024))) . "\n";
}

и вот код клиента:

<html>
<body>
<div id="root"></div>
<script>
    var host = 'ws://10.10.20.212:1414/websockets.php';
    var socket = new WebSocket(host);
    socket.onmessage = function(e) {
        document.getElementById('root').innerHTML = e.data;
        socket.send("abc");
    };
</script>
</body>
</html>

вывод выглядит так:

socket_read: �ƒÛ¸b¹z
string(9) "�ƒPÂMn2¡"
var_dump socket_read: 
json_decode socket_read: 
NULL
var_dump json_decode socket_read: 
...