Делать HTTP-запросы без открытия нового соединения - PullRequest
0 голосов
/ 05 ноября 2019

Если браузер открывает соединение с удаленным сервером, возможно ли получить доступ к этому же соединению через Javascript?

У меня в сети есть небольшой модуль Ethernet, который я программирую сортироватьпримерно так (псевдокод):

private var socket
while(true) {
    if(socket is disconnected) {
        open socket
        listen on socket (port 80)
    }
    if(connection interrupt) {
        connect socket
    }
    if(data receive interrupt) {
        serve
    }
    if(disconnection interrupt) {
        disconnect socket
    }
}

Дело в том, что он прослушивает один сокет для HTTP-запросов и обслуживает их.

В моем веб-браузере яможет подключиться к устройству, сделав HTTP-запрос GET для некоторого HTML / JS, который я написал, и это работает. На сокете открывается соединение, и файлы возвращаются в виде HTTP-ответов.

Теперь я хочу нажать кнопку на веб-странице, чтобы браузер отправил HTTP-запрос POST по тому же соединению. В моем Javascript у меня есть (отредактировано и отформатировано для ясности):

// This function sends an HTTP request
function http(type, url, data, callbacks) {
    // make a new HTTP request
    var request = new XMLHttpRequest();

    // open a connection to the URL
    request.open(type, url + (data ? "?" + data : ""));

    // add headers
    if(type == "POST")
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    // register callbacks for the request
    Object.keys(callbacks).forEach(function(callback) {
        request[callback] = function() {
            callbacks[callback](request.responseText);
        };
    });

    // send and return the request
    request.send();
    return request;
}

// Here is where I call the function
http("POST",                // use POST method
     "http://192.168.1.99", // IP address of the network device
     dataToSend,            // the data that needs to be sent
     {                      // callbacks
         onloadend: function(data) {
             console.log("success. got: " + data); // print 'success' when the request is done
         },
         onerror: function(data) {
             console.log("There was an error.");   // print 'error' when it fails
             console.log(data);
         }
     }
);

Проблема здесь в том, что этот открывает новое соединение с устройством, но я хочу использовать то же самоесокет, к которому браузер уже подключен. Возможно ли это, и если да, то как?

1 Ответ

1 голос
/ 06 ноября 2019

В браузере отсутствует элемент управления приложением, позволяющий определить, используется ли новое соединение для следующего запроса или используется существующее соединение. На самом деле, совершенно нормально, что браузер будет использовать несколько подключений параллельно с одним и тем же сервером, и ваш сервер должен справиться с этим.

Поскольку ваша серверная архитектура может работать только с одним соединением за раз, вам нужно либо изменить архитектуру для обработки нескольких параллельных соединений, либо убедиться, что вам нужно обрабатывать только одно соединение ввремя. Последнее может быть достигнуто путем не поддержки HTTP keep-alive, то есть путем закрытия соединения сразу после каждого ответа. Таким образом, новый запрос приведет к новому соединению (что не является тем, что вы хотели в соответствии с вашим вопросом), но ваш сервер также сможет обрабатывать это новое соединение (что вам, скорее всего, в конечном счете понадобится), так как предыдущее было закрыто.

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