Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Возможно ли средствами javascript прочитать сокеты по ip/порту стороннего сервера?

#javascript #websocket


Сейчас с помощью php получаю данные из разных сокетов по ip:port (с помощью фунуции
fsockopen). Это делается для получения играющей в данный момент композиции на разных
радиостанциях:

$open = fsockopen($radioip,$radioport,$errno,$errstr,'.5');
    if ($open) {
        fputs($open,"GET /7.html HTTP/1.1\nUser-Agent:Mozilla\n\n");
        stream_set_timeout($open,'1');
        $read = fread($open,255); }


В результате основной javascript на главной странице регулярно обращается к этому
php на сервере.
Хочется, чтобы всё это работало без лишних запросов к серверу, а средствами самого
браузера. Возможно ли сделать подобную функцию на javascript - чтобы передавать ей
ip и port а в результате получать необходимые данные?
    


Ответы

Ответ 1



К сожалению, любые запросы браузером вне вашего "Origin" возможны только, если на той отвечающей стороне в заголовках ответов есть Access-Control-Allow-Origin с вашим origin. Это дело все закрыто для безопастности, т.к. если бы можно было с любого сайта вызывать AJAXом другой - очень много всего плохого можно было бы делать так. Подробнее про кросс-доменный AJAX например вот тут Websockets при этом вам в данном случае совершенно не помогут, т.к. это отдельный протокол обмена данными между сервером и клиентом. И причем последнее время браузеры все чаще форсируют wss (шифрованные вебсокеты), для которых помимо поддержки Websockets еще и SSL на этом поддерживающем сервере нужен. Так что вам особо без промежуточного php скрипта не обойтись. Если вы задаетесь этим вопросом по причине большой нагрузки на ваш сервер - стоит задуматься облегчением этого всего дела чем-то типа тех же websockets. Только не сторонними серверами, а вашим собственным. Который будет например сам с какой-то определенной частотой обновлять свой кэш по удаленным серверам и с определенной частотой(или по факту изменения) присылать информацию клиентам. В websockets соединение держится и в нем возможен двухсторонний диалог между клиентом и сервером. Тем самым клиентам не нужно будет постоянно обращаться к какой-либо страничке, а они просто получат websocket message по факту его отправки. Такое можно реализовать например на Node.js или ASP.net. На PHP лично я не видел подобных штук.

Ответ 2



Попробуй веб сокеты HTML5. var socket = new WebSocket("ws://IPAddress:PORT"); socket.onopen = function() { alert("Соединение установлено."); }; socket.onclose = function(event) { if (event.wasClean) { alert('Соединение закрыто чисто'); } else { alert('Обрыв соединения'); // например, "убит" процесс сервера } alert('Код: ' + event.code + ' причина: ' + event.reason); }; socket.onmessage = function(event) { alert("Получены данные " + event.data); }; socket.onerror = function(error) { alert("Ошибка " + error.message); };

Ответ 3



1006 CLOSE_ABNORMAL Reserved. Used to indicate that a connection was closed abnormally (that is, with no close frame being sent) when a status code is expected. https://developer.mozilla.org/ru/docs/Web/API/CloseEvent Из мозиловского справочника по CloseEvent Но я предполагаю, что на той стороне просто не websocket server, а если это так, то со страницы (читай из браузера) вы никак не получите поток данных с этого сокета.

Ответ 4



Чтобы вы могли подключиться по WebSocket к тому серверу, тот сервер должен поддерживать протокол WebSocket, который несколько отличается от HTTP. Для всех популярных серверов есть модули для поддержки этого протокола. Если же вы не контролируете удаленный сервер, то остается посоветовать кешировать данные: например, если вы знаете что сейчас играет такая-то секунда t композиции длительностью s, то в следующий раз обратиться к тому серверу вам нужно лишь через s-t секунд. За исключением технологии WebSocket и очевидных дыр в браузерах, вы не можете подсоединяться для получения данных используя только JS к произвольным портам на произвольных IP. Представьте себе если бы это было возможно!

Комментариев нет:

Отправить комментарий