@dmalapsh

Как подключить websocket?

Пытаюсь настроить вебсокет. В js просто создаю объект socket = new WebSocket("wss://3d-mitra.ru/test.php");
На серверной стороне прописал открытие сокета
define('PORT',"8080");
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);//создаём сокет
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений
socket_bind($socket, "92.53.96.36" , PORT);//привязываем его к указанным ip и порту

socket_listen($socket);//слушаем сокет

// echo socket_strerror(socket_last_error($socket));
while (true) {
  $newSocket = socket_accept($socket); //echo "ok";
  var_dump($newSocke);
  $header = socket_read($socket, 1024);
  sendHeaders($header,$newSocket,'3d-mitra.ru', PORT);
}
socket_close($socket);

function sendHeaders($hederText,$newSocket,$host,$port){
  $headers = array();
  $tmpLine = preg_split('/\r\n/', $hederText);
  foreach ($tmpLine as $line) {
    $line = rtrim($line);
    if (preg_match('/\A(\S+): (.*)\z/', $line, $matches)) {
      $headers[$matches[1]] = $matches[2];
     
    }
  }
  $sKey = base64_encode(pack('H*',sha1($headers['Sec-WebSocket-Key'].'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))) ;
  $strHeader = "HTTP/1.1 101 Switching Protocols\r\n" .
        "Upgrade: websocket\r\n" .
        "Connection: Upgrade\r\n" .
        "Sec-WebSocket-Extensions: deflate-frame\r\n".
        "Sec-WebSocket-Protocol: soap\r\n".
        "Sec-WebSocket-Origin: $host".
        "Sec-WebSocket-Location: wss://$host/test.php\r\n".
        "Sec-WebSocket-Accept:$sKey\r\n\r\n";
    socket_write($newSocket,$strHeader, strlen($strHeader));
}

Через ssh запускаю этот скрипт, ошибок не выдает, порт прослушивается.
Но соединится не получается, выпадает в 502 ошибку при попытке подключится
  • Вопрос задан
  • 382 просмотра
Пригласить эксперта
Ответы на вопрос 2
@MaLuTkA_UA
Используйте библиотеку workerman для поднятия нормального сокета на php. Ваш вариант работать не будет. Для wss нужны валидные сертификаты либо проксировать на nginx
Ответ написан
bingo347
@bingo347
Crazy on performance...
Что-то мне подсказывает, что тут: $header = socket_read($socket, 1024); нужно читать из $newSocket
Но соединится не получается, выпадает в 502 ошибку при попытке подключится
502 обычно говорит, что nginx (или что у Вас в качестве реверс-прокси) не может подключится к бэкенду.

Проверьте, можно ли подключится telnet'ом к php серверу с машины на которой nginx, может банальный фаервол не пускает.
Проверьте что правильно прописан конфиг проксирования
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы