Невозможно подключиться к веб-сокету с помощью wss: // в php - PullRequest
0 голосов
/ 31 декабря 2018

Прежде всего, я хочу извиниться, если в моем сообщении есть какие-то ошибки. Я не являюсь носителем английского (французского).Поэтому я столкнулся с проблемой при попытке подключиться к веб-сокету с доменом wss: //.Домен такой: wss: //engine.coss.io/api/v1/ws/v1/ht/ {ETH_BTC}.последняя часть URL является королем строки запроса, подробности которой вы можете найти по адресу: https://api.coss.io/v1/spec

Сначала я попытался подключиться к этому адресу через chrome, но я получаю сообщение об ошибке "ERR_DISALLOWED_URL_SCHEME"и я обнаружил, что это связано с какими-то недостающими сертификатами.Но моя цель состояла в том, чтобы заставить его работать с php, поэтому я попробовал несколько способов подключиться к этому адресу, но ничего не получилось, это один из способов, которым я пытался подключиться к нему:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
echo $socket;
echo socket_connect($socket ,"35.198.217.124",443)?"true":"false";


$in = "GET / HTTP/1.1\r\n";
$in .= "Host: www.example.com\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Sending HTTP GET request...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";

echo "Reading response:\n\n";
while ($out = socket_read($socket, 2048)) {
echo $out;
}

Спасибо за любую помощь:) С Новым годом!

РЕДАКТИРОВАТЬ:

После нескольких попыток я попадаю в ситуацию, когда у меня есть два куска кода для получения ответа 200 в корне машины, но определенно не то, что яхочу, а второй, который получает 400 ошибок, неправильно запрашивает два фрагмента кода:

ответ 200 на корень (обратите внимание, что если я добавлю / api к пути, я получу ошибку 404):

$contextOptions = array(
    'ssl' => array(
        "verify_peer" => false,
        "verify_peer_name" => false
    )
);
$context = stream_context_create($contextOptions);

$fp = stream_socket_client("ssl://engine.coss.io:443", $errstr, $errno, 30, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    echo "true\n";

    fwrite($fp, "GET / HTTP/1.1\r\n" .
        "Host: www.engine.coss.io\r\n" .
        "Accept: */*\r\n" .
        "Connection: Upgrade\r\n" .
        "Upgrade: websocket\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}

А этот дает мне 400 плохих запросов:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
echo $socket;
echo socket_connect($socket ,"35.198.217.124",443)?"true":"false";


$in = "GET /api/v1/ws/v1/ht/{ETH_BTC} HTTP/1.1\r\n";
$in .= "Host: https://www.engine.coss.io\r\nAccept: */*\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\r\n";
//$in .= "Connection: Close\r\n\r\n";
$out = '';

echo "Sending HTTP GET request...";
socket_write($socket, $in, strlen($in));
echo "OK.\n";

echo "Reading response:\n\n";
while ($out = socket_read($socket, 2048)) {
echo $out;
}

РЕДАКТИРОВАТЬ 2:

Поэтому я пишу в службу поддержки веб-сайта, который мне сказал, что там былоошибка в URL, правильная: wss: //engine.coss.io/ws/v1/ht/ {ETH_BTC}

Кажется, это работает с этим кодом, потому что я получил 101 успешное рукопожатиено проблема сейчас в том, что сценарий заканчивается после рукопожатияуспешно, так что я никогда не получаю нужную информацию, может быть, есть способ сохранить сценарий прослушивания через веб-сокет?Я ничего не нашел в документации ...

код:

$contextOptions = array(
    'ssl' => array(
        "verify_peer"=>false,
        "verify_peer_name"=>false
    )
);
$context = stream_context_create($contextOptions);

$fp =stream_socket_client("ssl://engine.coss.io:443/ws/v1/ht/{COSS_ETH}",$errstr,$errno,30,STREAM_CLIENT_CONNECT,$context);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
echo "true\n";



fwrite($fp, "GET /ws/v1/ht/{COSS_ETH} HTTP/1.1\r\nHost: engine.coss.io\r\nAccept: */*\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n");
    // Notez que si ici je rajoute au path /api/v1/ws/v1/ht/{ETH_BTC} j'obtiens une erreur 404 not found ...

    while (!feof($fp)) {

        echo fgets($fp, 2024);

    }
}

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Я заставил ваш второй блок кода работать (тот, что с stream_context_create ()).Код ниже возвращает обменный курс между ETH и BTC.Я не думаю, что вам нужно реализовывать wss: // больше, потому что их API, кажется, также доступны на https://

$contextOptions = array(
    'ssl' => array(
        "verify_peer" => false,
        "verify_peer_name" => false
    )
);
$context = stream_context_create($contextOptions);

$fp = stream_socket_client("ssl://engine.coss.io:443", $errstr, $errno, 30, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    echo "true\n";

    fwrite($fp, "GET /api/v1/dp?symbol=ETH_BTC  HTTP/1.1\r\n" .
        "Host: engine.coss.io\r\n" .
        "Accept: */*\r\n" .
        "Connection: Upgrade\r\n" .
        "Upgrade: websocket\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}

Возвращает:

{"symbol":"ETH_BTC","asks":[["0.03698000","0.12000000"],["0.03705000","0.12000000"],["0.03715000","0.12000000"], .....
0 голосов
/ 31 декабря 2018

Поток 'wss: //' по умолчанию не поддерживается PHP, но вы можете реализовать свой собственный класс StreamWrapper 'wss: //'.

Вот пример.Изменение 'var' на 'wss' в stream_wrapper_register () поможет вам начать работу.

http://php.net/manual/en/stream.streamwrapper.example-1.php

Вот все методы, которые вы можете реализовать в своем классе StreamWrapper, но вы, вероятно, выиграли 'они нужны всем.

http://php.net/manual/en/class.streamwrapper.php

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...