LINUX.ORG.RU

История изменений

Исправление Stanson, (текущая версия) :

А как-же реконнект? Особенно, если сообщения по несколько байт? Аналоговый датчик, например

function sensor_poll()
{
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function()
    {
        if( this.readyState !== 4 ) return;
        if( this.status !== 200 ) return;
        var obj = JSON.parse( this.responseText );
        document.getElementById("temp").textContent = obj.temp;
        sensor_poll();
    }
    xhr.open( 'GET', 'your-sensor-hostname.lan:14088/data', true );
    xhr.setRequestHeader('Connection', 'keep-alive'); // Это для браузера, на самом деле.
    xhr.send();
}

Ну и все твои XMLHttpRequest'ы будут отправляться по уже открытому соединению. Для твоего сервера это будет выглядеть как

Открыто соединение с клиента

> GET /data HTTP/1.1
> Host: your-sensor-hostname.lan
> Connection: keep-alive
>

Прошло X времени

< HTTP/1.1 200 OK
< Content-Length: 15
< Content-Type: application/json
<
< {"temp":"22.0"}

Твой XMLHttpRequest получает данные, зовёт onreadystatechange,
где данные куда-нибудь показываются и запускается новый
XMLHttpRequest, сразу, по тому же соединению

> GET /data HTTP/1.1
> Host: your-sensor-hostname.lan
> Connection: keep-alive
>

Когда данные готовы, опять

< HTTP/1.1 200 OK
< Content-Length: 15
< Content-Type: application/json
<
< {"temp":"22.0"}

И так до бесконечности

Чем это вообще отличается от вебсокета? Заголовками?

Исходная версия Stanson, :

А как-же реконнект? Особенно, если сообщения по несколько байт? Аналоговый датчик, например

function sensor_poll()
{
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function()
    {
        if( this.readyState !== 4 ) return;
        if( this.status !== 200 ) return;
        var obj = JSON.parse( this.responseText );
        document.getElementById("temp").textContent = obj.temp;
        sensor_poll();
    }
    xhr.open( 'GET', 'your-sensor-hostname.lan:14088/data', true );
    xhr.setRequestHeader('Connection', 'keep-alive');
    xhr.send();
}

Ну и все твои XMLHttpRequest'ы будут отправляться по уже открытому соединению. Для твоего сервера это будет выглядеть как

Открыто соединение с клиента

> GET /data HTTP/1.1
> Host: your-sensor-hostname.lan
> Connection: keep-alive
>

Прошло X времени

< HTTP/1.1 200 OK
< Content-Length: 15
< Content-Type: application/json
<
< {"temp":"22.0"}

Твой XMLHttpRequest получает данные, зовёт onreadystatechange,
где данные куда-нибудь показываются и запускается новый
XMLHttpRequest, сразу, по тому же соединению

> GET /data HTTP/1.1
> Host: your-sensor-hostname.lan
> Connection: keep-alive
>

Когда данные готовы, опять

< HTTP/1.1 200 OK
< Content-Length: 15
< Content-Type: application/json
<
< {"temp":"22.0"}

И так до бесконечности

Чем это вообще отличается от вебсокета? Заголовками?