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

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

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

Похожие вопросы