Что такое WebSocket. Что лучше — Веб-сокеты или AJAX? Время жизни канала

У меня есть приложение vb.net, которое открывает сокет и прослушивает его.

Мне нужно связаться через этот сокет с этим приложением, используя javascript, запущенный в браузере. То есть мне нужно отправить некоторые данные в этот сокет, чтобы приложение, которое прослушивает этот сокет, может принимать эти данные, делать некоторые вещи, используя некоторые удаленные вызовы, и получать еще несколько данных и помещать их обратно в сокет, который мне нужен javascript. прочитайте и распечатайте его в браузере.

Ive try, socket.io, websockify, но ни один из них не оказался полезным.

Следовательно, вопрос, что я пытаюсь даже сделать возможным? Есть ли способ, с помощью которого javascript, работающий в браузере, может подключаться к сокету tcp и отправлять некоторые данные и прослушивать его для получения некоторого ответа на данные в сокете и печатать его в браузере.

Если это возможно, кто-то может указать мне в правильном направлении, чтобы помочь мне установить цель.

6 ответов

Что касается вашей проблемы, в настоящее время вам придется зависеть от XHR или веб-узлов для этого.

Чтобы получить доступ к этому API, вам нужно включить флажок эксперимента в манифесте расширений. Использование сокетов довольно просто, например:

Chrome.experimental.socket.create("tcp", "127.0.0.1", 8080, function(socketInfo) { chrome.experimental.socket.connect(socketInfo.socketId, function (result) { chrome.experimental.socket.write(socketInfo.socketId, "Hello, world!"); }); });

Вы можете использовать HTML5 Web Sockets:

Var connection = new WebSocket("ws://IPAddress:Port"); connection.onopen = function () { connection.send("Ping"); // Send the message "Ping" to the server };

Ваш сервер также должен прослушиваться с сервера WebSocket, такого как pywebsocket, иначе вы можете написать свой собственный, как описано в Mozilla

Дополнительно:

Это будет возможно через интерфейс навигатора, как показано ниже:

Navigator.tcpPermission.requestPermission({remoteAddress:"127.0.0.1", remotePort:6789}).then(() => { // Permission was granted // Create a new TCP client socket and connect to remote host var mySocket = new TCPSocket("127.0.0.1", 6789); // Send data to server mySocket.writeable.write("Hello World").then(() => { // Data sent sucessfully, wait for response console.log("Data has been sent to server"); mySocket.readable.getReader().read().then(({ value, done }) => { if (!done) { // Response received, log it: console.log("Data received from server:" + value); } // Close the TCP connection mySocket.close(); }); }, e => console.error("Sending error: ", e););

// Host we are connecting to var host = "localhost"; // Port we are connecting on var port = 3000; var socket = new jSocket(); // When the socket is added the to document socket.onReady = function(){ socket.connect(host, port); } // Connection attempt finished socket.onConnect = function(success, msg){ if(success){ // Send something to the socket socket.write("Hello world"); }else{ alert("Connection to the server could not be estabilished: " + msg); } } socket.onData = function(data){ alert("Received from socket: "+data); } // Setup our socket in the div with the id="socket" socket.setup("mySocket");

Чтобы достичь желаемого, вам нужно написать два приложения (например, на Java или Python):

Приложение Bridge, которое находится на клиентском компьютере и может работать как с сокетами TCP/IP, так и с WebSockets. Он будет взаимодействовать с рассматриваемым сокетом TCP/IP.

Серверное приложение (например, JSP/Servlet WAR), которое может общаться через WebSockets. Он включает в себя по крайней мере одну HTML-страницу (включая код обработки на стороне сервера, если это необходимо) для доступа через браузер.

Это должно работать так

  • Bridge откроет WS-соединение с веб-приложением (поскольку сервер не может подключиться к клиенту).
  • Веб-приложение попросит клиента идентифицировать себя
  • Клиент моста отправляет некоторую идентификационную информацию на сервер, который хранит ее, чтобы идентифицировать мост.
  • Страница для просмотра в браузере подключается к серверу WS с помощью JS.
  • Повторите шаг 3, но для страницы на основе JS
  • Страница на основе JS отправляет команду на сервер, в том числе на какой мост он должен идти.
  • Сервер перенаправляет команду на мост.
  • Мост открывает сокет TCP/IP и взаимодействует с ним (отправляет сообщение, получает ответ).
  • Мост отправляет ответ на сервер через WS
  • WS пересылает ответ на страницу для просмотра в браузере
  • JS обрабатывает ответ и реагирует соответственно
  • Повторяйте, пока один из клиентов не отключится/не выгружается
  • Примечание 1. Вышеприведенные шаги являются огромным упрощением и не включают информацию об обработке ошибок и запросах keepAlive в случае, если клиент преждевременно отключается или сервер должен сообщить клиентам, что он выключается/перезапускается.

    Примечание 2: В зависимости от ваших потребностей, возможно объединить эти компоненты в один, если рассматриваемый сервер сокетов TCP/IP (с которым соединяется мост) находится на той же машине, что и серверное приложение.

    22.9. Веб-сокеты

    В главе 18 демонстрируется, как клиентские сценарии на языке JavaScript могут взаимодействовать с серверами по сети. Все примеры в этой главе используют протокол HTTP, а это означает, что все они ограничены исходной природой протокола HTTP: этот протокол, не имеющий информации о состоянии, состоит из запросов клиента и ответов сервера. Протокол HTTP фактически является узкоспециализированным сетевым протоколом. Более универсальные сетевые взаимодействия через Интернет (или через локальные сети) часто реализуются с использованием долгоживущих соединений и обеспечивают двунаправленный обмен сообщениями через TCP-сокеты. Довольно небезопасно предоставлять клиентскому сценарию на языке JavaScript доступ к низкоуровневым ТСР-сокетам, однако спецификация «WebSocket АРІ» определяет безопасную альтернативу: она позволяет клиентским сценариям создавать двунаправленные соединения с серверами, поддерживающими протокол веб-сокетов. Это существенно упрощает решение некоторых сетевых задач.

    Прикладной интерфейс веб-сокетов удивительно прост в использовании. Сначала необходимо создать сокет с помощью конструктора WebSocket():
    var socket = new WebSocket("ws://ws.example.com:1234/resource");

    Протокол веб-сокетов

    Чтобы использовать веб-сокеты в сценариях на языке JavaScript, достаточно будет освоить клиентский прикладной интерфейс веб-сокетов, описываемый здесь. Не существует эквивалентного серверного прикладного интерфейса для создания серверов с поддержкой веб-сокетов; в этом разделе будет представлен простой пример сервера, основанного на использовании интерпретатора Node (раздел 12.2) и сторонней серверной библиотеки поддержки веб-сокетов. Клиент и сервер взаимодействуют через долгоживущие TCP-сокеты, следуя правилам, определяемым протоколом веб-соке-тов. Мы не будем рассматривать здесь особенности протокола, но следует отметить, что протокол веб-сокетов спроектирован очень аккуратно, благодаря чему веб-серверы могут легко обрабатывать HTTP-соединения и соединения на основе веб-сокетов через один и тот же порт.

    Веб-сокеты получили широкую поддержку среди производителей броузеров. В ранней, предварительной версии протокола веб-сокетов была обнаружена серьезная брешь в системе безопасности, поэтому на момент написания этих строк в некоторых броузерах поддержка веб-сокетов была отключена, - до стандартизации безопасной версии протокола. В Firefox 4, например, может потребоваться явно включить поддержку веб-сокетов, открыв страницу about:config и установив переменную «network.websocket. override-security-block» в значение true.

    *********************************************

    Аргументом конструктора WebSocket() является URL-адрес, в котором используется протокол ws:// (или wss:// - в случае с безопасными соединениями, по аналогии с https://). URL-адрес определяет имя хоста, к которому выполняется подключение, и может также определять порт (по умолчанию веб-сокеты используют тот же порт, что и протоколы HTTP и HTTPS) и путь или ресурс.

    После создания сокета в нем обычно регистрируются обработчики событий:

    socket.onopen = function(e) { /* Соединение установлено. */ };
    socket.onclose = function(e) { /* Соединение закрыто. */ };
    socket.onerror = function(e) { /* Что-то пошло не так! */ };
    socket.onmessage = function(e) {
    var message = e.data; /* Сервер послал сообщение. */
    };

    Чтобы отправить данные серверу через сокет, следует вызвать метод send() сокета:

    socket.send("Привет, сервер!");

    Текущая версия прикладного интерфейса веб-сокетов поддерживает только текстовые сообщения и отправляет их в виде строк в кодировке UTF-8. Однако текущая версия спецификации протокола веб-сокетов включает поддержку двоичных сообщений, и будущие версии прикладного интерфейса, возможно, будут обеспечивать обмен двоичными данными с сервером.

    По окончании взаимодействия с сервером сценарий может закрыть веб-сокет вызовом его метода close() .

    Веб-сокеты являются двунаправленными, и единственное соединение, установленное через веб-сокет, может использоваться клиентом и сервером для передачи сообщений друг другу в любой момент времени. Это взаимодействие не обязательно должно иметь форму запросов и ответов. Каждая служба, основанная на веб-сокетах, будет определять собственный «подпротокол» передачи данных между клиентом и сервером. С течением времени эти «подпротоколы» могут развиться, и вам может потребоваться реализовать клиенты и серверы, поддерживающие несколько версий подпротокола. К счастью, протокол веб-сокетов включает механизм, дающий возможность договориться о выборе подпротокола, который поддерживается и клиентом, и сервером. Конструктору WebSocket() можно передать массив строк. Сервер получит его в виде списка подпротоколов, поддерживаемых клиентом. Сервер выберет подпротокол, поддерживаемый им, и отправит его обратно клиенту. После установления соединения клиент сможет определить, какой подпротокол можно использовать, проверив свойство protocol объекта WebSocket .

    В разделе 18.3 описывается прикладной интерфейс объекта EventSource и демонстрируется его применение на примере реализации клиента и сервера чата. Вебсокеты еще больше упрощают реализацию подобных приложений. В примере 22.16 демонстрируется очень простой клиент чата: он напоминает пример 18.15, но использует веб-сокеты для двунаправленного обмена сообщениями вместо объекта EventSource для приема сообщений и XMLHttpRequest - для отправки.

    Пример 22.16. Клиент чата на основе веб-сокетов


    window.onload = function() {
    // Позаботиться о некоторых деталях пользовательского интерфейса
    var nick = prompt("Введите свой псевдоним"); // Получить псевдоним
    var input = document.getElementById("input"); // Отыскать поле ввода
    input.focus(); // Установить фокус ввода
    // Открыть веб-сокет для отправки и приема сообщений в чате.
    // Предполагается, что HTTP-сервер, откуда загружается сценарий, также
    // поддерживает веб-сокеты, и для связи с ним используется то же имя хоста
    // и номер порта, но вместо протокола http:// используется протокол ws://
    var socket = new WebSocket("ws://" + location.host + "/");
    // Так через веб-сокет принимаются сообщения с сервера
    socket.onmessage = function(event) { // Вызывается при получении сообщения
    var msg = event.data; // Получить текст из объекта события
    var node = document.createTextNode(msg); // Создать текстовый узел
    var div = document.createElement("div"); // Создать элемент
    div.appendChild(node); // Добавить текстовый узел
    document.body.insertBefore(div, input); // и вставить div перед полем ввода
    input.scrollIntoView(); // Гарантировать видимость элемента input
    }
    // Так через веб-сокет отправляются сообщения на сервер
    input.onchange = function() { // Когда пользователь нажмет клавишу Enter
    var msg = nick + ": " + input.value; // Имя пользователя и текст
    socket.send(msg); // Отправить через сокет
    input.value = ""; // Подготовиться к вводу следующего сообщения
    }
    };