Підключення до TCP Socket від браузера за допомогою JavaScript


111

У мене є програма vb.net, яка відкриває сокет і слухає його.

Мені потрібно спілкуватися через цей сокет із цією програмою за допомогою javascript, який працює в браузері. Тобто мені потрібно надіслати деякі дані цього сокету, щоб програма, яка слухає цей сокет, могла приймати ці дані, робити якісь речі за допомогою віддалених дзвінків і отримувати ще деякі дані, і повертати їх на розетку, для якої потрібен мій javascript читати та друкувати у браузері.

Я намагався, socket.io, websockify, але жоден не виявився корисним.

Звідси виникає питання, а що я намагаюся зробити навіть можливим? Чи існує спосіб, що JavaScript, який працює в браузері, може підключитися до сокета tcp і надіслати деякі дані та прослухати їх для отримання ще однієї відповіді даних на сокет і роздрукувати їх у браузері.

Якщо це можливо, може хтось вказати мене в правильному напрямку щодо того, який би міг допомогти мені встановити мету.


3
Ні, ви обмежені WebSockets
Бергі,

2
@Bergi - HTTP - це протокол через tcp, тому чому можна встановити HTTP-з'єднання, але не TCP?
AlikElzin-kilaka

@kilaka: Оскільки (стандартні) API, доступні в середовищі браузера , обмежені ними .
Бергі

Можливий дублікат: stackoverflow.com/questions/9154035 / ...
AlikElzin-kilaka

6
Я бачу новий стандарт повзучого хребта Javascript: w3.org/TR/raw-sockets .
AlikElzin-kilaka

Відповіді:


57

Що стосується вашої проблеми, для цього вам зараз доведеться залежати від XHR або веб-розеток.

Наразі жоден популярний браузер не реалізував жодних таких необроблених сокетів api для javascript, які дозволяють створювати та отримувати доступ до необроблених сокетів, однак розробляється проект для реалізації сирих сокетів api в JavaScript. Перегляньте ці посилання:
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

Зараз Chrome має підтримку необроблених сокетів TCP та UDP у своїх "експериментальних" API. Ці функції доступні лише для розширень і, хоча документовані, на даний момент приховані. Сказавши це, деякі розробники вже створюють цікаві проекти, використовуючи його, наприклад, цей клієнт IRC .

Для доступу до цього 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!");         
    });
});

Які браузери підтримують необроблені сокети?
АлікЕльзін-кілака

2
Будь-яка продуктивність збільшується порівняно з Websockets та Rawsockets?
NiCk Newman

3
Не дозволяє javascript у браузері підключитися до порту tcp, отвору в безпеці? Уявіть, що JavaScript у вашому Firefox / chrome підключається до будь-якого локального запуску (скажімо, MySQL DB) та публікує дані на злому сайті?
Arun Avanathan

@ArunAvanathan все, що ви робите з ajax, ви можете робити з розетками і навпаки ... жодних питань безпеки, як я думаю.
Фірас Абд Алрахман

1
@FirasAbdAlrahman Я думаю, що існують різні політики безпеки, що регулюють поведінку браузера для HTTP / S. Отже, підключення сокетів браузера через TCP не є таким, як HTTP / S.
Arun Avanathan

30

Це стане можливим через інтерфейс навігатора, як показано нижче:

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)
    );
  }
);

Більш детально викладено в документації на w3.org tcp-udp-sockets.

http://raw-sockets.sysapps.org/#interface-tcpsocket

https://www.w3.org/TR/tcp-udp-sockets/

Ще одна альтернатива - використовувати розетки Chrome

Створення з'єднань

chrome.sockets.tcp.create({}, function(createInfo) {
  chrome.sockets.tcp.connect(createInfo.socketId,
    IP, PORT, onConnectedCallback);
});

Надсилання даних

chrome.sockets.tcp.send(socketId, arrayBuffer, onSentCallback);

Отримання даних

chrome.sockets.tcp.onReceive.addListener(function(info) {
  if (info.socketId != socketId)
    return;
  // info.data is an arrayBuffer.
});

Ви також можете спробувати використовувати HTML5 Web Sockets(Хоча це не пряме спілкування TCP):

var connection = new WebSocket('ws://IPAddress:Port');

connection.onopen = function () {
  connection.send('Ping'); // Send the message 'Ping' to the server
};

http://www.html5rocks.com/en/tutorials/websockets/basics/

Ваш сервер також повинен слухати з сервером WebSocket, таким як pywebsocket, або ви можете написати свій власний текст, як зазначено в Mozilla


25
Щоб детальніше розглянути цю відповідь: сервер також повинен слухати з сервером WebSocket. WebSockets не можуть підключитися безпосередньо до необмеженої розетки TCP. websockify - це інструмент, який виступає як проксі-сервер WebSocket-TCP: він сидить на вашому сервері та слухає підключення WebSocket, а потім пересилає зв’язок WebSocket до та з вказаного сокета TCP.
апспіллери

58
Це не відповідає на запитання - websocket - це протокол через TCP (наприклад, HTTP), а не прямий зв'язок TCP.
АлікЕльзін-кілака

1
але як помістити повідомлення у вікно браузера? :(
shzyincu

3
Ця відповідь абсолютно неправильна і її слід видалити.
Бред

1
@Brad ця відповідь допомогла мені, і, мабуть, допомогла деяким іншим, маючи 22 нагороди.
користувач1378687

6

Проект ws2s спрямований на підведення сокета до js-оглядача. Це сервер websocket, який перетворює websocket в сокет.

ws2s принципова схема

введіть тут опис зображення

зразок коду:

var socket = new WS2S("wss://ws2s.feling.io/").newSocket()

socket.onReady = () => {
  socket.connect("feling.io", 80)
  socket.send("GET / HTTP/1.1\r\nHost: feling.io\r\nConnection: close\r\n\r\n")
}

socket.onRecv = (data) => {
  console.log('onRecv', data)
}

5

Див. Jsocket . Я не використовував його сам. Пройшло більше 3 років з моменту останнього оновлення (станом на 26/6/2014).

* Використовує спалах :(

З документації :

<script type='text/javascript'>
    // 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');       
</script>

0

Рішення, яке ви справді шукаєте, - це веб-розетки. Однак проект хрому розробив деякі нові технології, які є прямими TCP-з'єднаннями TCP Chrome


0

Для того, щоб досягти того, що ви хочете, вам доведеться написати два додатки (наприклад, на Java або Python):

  1. Додаток Bridge, який сидить на комп'ютері клієнта і може працювати як з TCP / IP розетками, так і з WebSockets. Він буде взаємодіяти з розглянутим сокетом TCP / IP.

  2. Додаток на сервері (наприклад, JSP / Servlet WAR), який може говорити WebSockets. Він включає щонайменше одну HTML-сторінку (включаючи код обробки на стороні сервера, якщо це необхідно), до якого переглядає браузер.

Має працювати так

  1. Міст відкриє WS-з'єднання з веб-додатком (оскільки сервер не може підключитися до клієнта).
  2. Веб-додаток попросить клієнта ідентифікувати себе
  3. Клієнт мосту надсилає деяку ідентифікаційну інформацію на сервер, який зберігає його з метою ідентифікації мосту.
    1. Сторінка, що переглядає браузер, підключається до сервера WS за допомогою JS.
    2. Повторіть крок 3, але для сторінки на базі JS
    3. Сторінка на базі JS надсилає команду серверу, включаючи, на який міст він повинен перейти.
    4. Сервер пересилає команду на міст.
    5. Міст відкриває сокет TCP / IP і взаємодіє з ним (надсилає повідомлення, отримує відповідь).
    6. Bridge надсилає відповідь серверу через WS
    7. WS пересилає відповідь на сторінку, що переглядається браузером
    8. СВ обробляє відповідь і відповідно реагує
    9. Повторюйте, поки жоден клієнт не відключить / вивантажить

Примітка 1: Наведені вище кроки є значним спрощенням і не включають інформацію про обробку помилок та запити KeepAlive, якщо будь-який клієнт передчасно відключиться або сервер повинен повідомити клієнтів, що він закриває / перезапускає.

Примітка 2: Залежно від ваших потреб, ці компоненти можуть бути об'єднані в один, якщо відповідний сервер сокетів TCP / IP (з яким переходить міст) знаходиться на тій же машині, що і серверний додаток.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.