powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
8 сообщений из 8, страница 1 из 1
Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
    #40072033
Andi_WEB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые участники!
Только не смейтесь, опыта JS никакого, да и в WEB тоже.

Однако, потребовалось организовать автоматическое восстановление соединенения с сервером. Нужна полная перезагрузка страницы, не из кеша, если я правильно выражаюсь, а так, что бы сервер открыл новую сессию. Причем, желательно, что бы это работало и в разных браузерах. Кстати, в IE, похоже, уже не работает.

Но тут нарисовалась еще более серьезная проблема.

Конечно, надо думать, какой-то код на JS может работать в браузере "вечно" и без соединения с сервером, пока сам браузер работоспособен.

Но, видимо, это не касается случая, когда мы обращаемся к серверу в попытках восстановления соединения. Через несколько минут
(причем, похоже, это время короче, если эта вкладка сейчас открыта на экране), Edge выводит сообщение "Не удается открыть эту страницу" и.т.д, и от моего скрипта, конечно, в браузере ничего не остается. Старница-то другая. Можно ли, для начала, это как-то побороть? Желательно чистый JS, только браузер, - на сервер надежды никакой, это практически железка с минимальным функционалом.

Пока, погуглив и кое-что переделав, пришел к такой конструкции, которая работает ограниченное время, дальше совершенствовать ее пока не возможно, из-за указанной проблемы:


Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
var Is_Connected = "";



 function request_image(url) 
 {
        return new Promise(function(resolve, reject) {
            var img = new Image();
            img.onload = function() { resolve(img); };
            img.onerror = function() { reject(url); };
            img.src = url + '?random-no-cache=' + Math.floor((1 + Math.random()) * 0x10000).toString(16);
        });
 };



 function ping(url, multiplier) 
 {
       
        return new Promise(function(resolve, reject) 
        {
            var start = (new Date()).getTime();
            var response = function() { 
                var delta = ((new Date()).getTime() - start);
                delta *= (multiplier || 1);
                resolve(delta); 
            };
            request_image(url).then(response).catch(response);
            
            setTimeout(function() { reject(Error('Timeout')); }, 2000);
        });
 }
    

var do_ping = function() {
        ping("http://192.168.1.49:10005/").then(function(delta) {
            
            if (delta<2000 && Is_Connected == "Try") 
               {
                Is_Connected = "Yes";                                                 
               }  
               
            if (delta<2000 && Is_Connected == "Lost") 
               {
                //window.open("http://192.168.1.49:10005/","_self");
                window.location.href =("http://192.168.1.49:10005/"); 
                Is_Connected = "Try";                                                 
               }            

            
            
        }).catch(function(error) {
             Is_Connected = "Lost"; 
        });
};




function Create_Timer() 
{
 Is_Connected = "Try";
 window.setInterval(do_ping, 3000);
}

 
document.addEventListener("DOMContentLoaded", Create_Timer);
...
Рейтинг: 0 / 0
Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
    #40072040
Andi_WEB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, наверное, нужно пояснить это предложение: "Нужна полная перезагрузка страницы, не из кеша, если я правильно выражаюсь, а так, что бы сервер открыл новую сессию. "

Дело в том, что сервер "трекает" каждого пользователя по уникальному URL, причем тайм-аут у него достаточно короткий, если клиент отвалился. Но если потом просто подсоединится по адресу 192.168.1.49:10005, то далее опять все хорошо работает (хоть сутки, пока есть связь), просто за 192.168.1.49:10005 добавляется случайный идентификатор. Не знаю, как это у сервера внутри устроено, полагаю, что после соединений он сразу дает редирект на новый URL и держит пул соединений. Но, в общем, главное тут, я думаю, заново загрузить с сервера страницу.
...
Рейтинг: 0 / 0
Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
    #40072128
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andi_WEB,
- Причем, желательно, что бы это работало и в разных браузерах. Кстати, в IE, похоже, уже не работает.

ИЕ ничего не знает про Promise

Если нужно просто "пнуть" сервер по адресу "http://192.168.1.49:10005/" не обращая внимания на результат (т.е. не перезагружая страницу тем ответом, который вернет сервер, то нужно использовать XMLHttpRequest (https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest) (работает и в ИЕ) или fetch (https://developer.mozilla.org/ru/docs/Web/API/Fetch_API) (более современные браузеры)
...
Рейтинг: 0 / 0
Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
    #40072129
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andi_WEB,
В конце концов, если нужно просо обратиться по какому то URL никак не обрабатывая результат (не важно что пришло, есть ошибки или нет, то вместо
window.location.href =("http://192.168.1.49:10005/");
можно просто
new Image().src = "http://192.168.1.49:10005/";
...
Рейтинг: 0 / 0
Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
    #40072153
Andi_WEB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
voraa, добрый день!

Про Promise понял, спасибо.

А дальше пока не совсем. Судя по всему, я не очень верно объяснил функционирование системы.

В идеале, она должна работать так:

1. Соединение с сервером
2. Если соединение установлено, страницу не перегружаем, это важно, но постоянно мониторим доступность сервера, что канал жив
3. Если сервер не доступен, делаем попытки переподключения, но не постоянно, а только тогда, когда связь опять появилась и "ping", cкажем, стал менее 2 сек. Хотя, если попытки переподключения (или проверки) не приведут к скорейшему возникновению нежелательной ошибки типа "Не удается открыть эту страницу" , то данный пункт можно упростить, и просто, например, делать только попытки переподключения.

Если я правильно понял, Вы как раз предлагаете внести изменения уже и в части, выполняющей проверку доступности сервера?
...
Рейтинг: 0 / 0
Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
    #40072201
Andi_WEB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И вот еще совсем не понятно - различное время до возникновения окончательной ошибки "Не удается открыть эту страницу", когда страница в браузере с моей обновляется на встроенную, и скрипт реконнекта перестает работать.

Иногда ошибка "GET http://192.168.1.49:10005/?random-no-cache=1e50a net::ERR_CONNECTION_REFUSED" в консоли отладки Edge, когда специально отключаю сервер, может идти примерно часа полтора. И потом, когда восстанавливаю связь с сервером, все работает. То "Не удается открыть эту страницу" появляется спустя 15 минут. Утверждать пока не могу, но похоже, что когда открыта консоль отладки в браузере, ошибка не появляется. Во всяком случае, оставлял на полтора часа - скрипт все это время работал и потом прошел реконнект.
...
Рейтинг: 0 / 0
Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
    #40072239
Andi_WEB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите, пожалуйста.

Подумал тут, в порядке бреда - как я понимаю, в конечном итоге фатальное "Не удается открыть эту страницу" возникает после некоторого числа выполнений этой строки:
img.src = url + '?random-no-cache=' + Math.floor((1 + Math.random()) * 0x10000).toString(16);

А если вынести определение img за функцию, и немного изменить обработчик ошибки:


вместо
Is_Connected = "Lost";

сделать:
Is_Connected = "Lost";
img.alt ="Not loaded";

Может, это повысит устойчивость всей схемы? Ошибка ведь возникает не сразу, а после довольно большого числа опросов сервера.
...
Рейтинг: 0 / 0
Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
    #40072242
Andi_WEB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или, точнее, просто присвоить img.alt ="Not loaded" перед проверкой...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Авто реконнект к серверу из JavaScript, полная перезагрузка страницы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]