Autor Zpráva
TomasJ
Profil
Zdravím vás. Konečně jsem docílil trvalého spojení na UDP server aniž bych musel obnovovat stránku. V PHP mám cyklus a v něm uspávač. Dřív mě štvalo že se stránka pořád načítala i když byla načtená (kvůli nekonečnému cyklu).
Nakonec jsem docílil toho, aby se stránka nenačítala, pomocí AJAXu... Myslel jsem, že budu muset pořád obnovovat stránku, ale ne, stačilo ji načíst jednou a pořád zůstala funkčnost stejná, akorát už se nenačítá stránka. No ale to jsem nechtěl.

Na serveru posílám každých 5 sekund zprávu "is-alive" klientům. Má to ověřit, zda má uživatel ještě zaplou stránku s udp spojením. Ověřuji to tím stylem, že na každý dotaz "is-alive" odpovím "keep-alive" a na serveru se vyhodnocuje... Pokud klient na "is-alive" neodpoví, spojení se ukončí a tak se uvolní port, a odstraní se ze seznamu připojených, který máme. No a problém je: na to "is-alive" se "keep-alive" odpovídá i přesto, že uživatel zavře stránku. Jak je to možné? Skript prostě pořád běží, i když uživatel stránku zavřel. To znamená, že se uživatel bere jako online a nikdy se neukončí spojení (až po restartu udp serveru). Dá se tomu nějak zabránit? Dá se nějak odeslat odpověď jen když je prohlížeč otevřený? Dokonce když zavřu úplně prohlížeč, pořád se skript vykonává... Mohl by mi někdo poradit? Tím AJAXem to není, zkoušel jsem stránku i bez něj a je to to samé. Děkuji moc za nějaké rady.
Amunak
Profil
TomasJ:
Nevím jestli jsem tě úplně přesně pochopil; pokud zavřeš okno (záložku) prohlížeče nebo odejdeš na jinou stránku, všechny skripty se přestanou vykonávat.

Nemůžeš prostě poslat ajax request na server s obsahem třeba is-alive, počkat na dokončení (odpověď od serveru) a pak spustit třeba třicetisekundový časovač, pak poslat request znova, etc.?

Na serveru bys pak měl nějaký skript který by kontroloval kdy naposled přišla odpověď od klienta a kdyby to bylo po delší době jak dejme tomu minuta, port by se uvolnil. Jestli počítám dobře, port by se pak měl uvolnit nejpozději po 1,5 minutě od doby, kdy uživatel opustil stránku. Ty časovače si samozřejmě udělej jak chceš, ale nevím, jak přesně ta aplikace funguje a přijde mi zbytečné zatěžovat klienta vícekrát než jednou za půl minuty.

Taky pamatuj, že je třeba časovač na nový request poslat až když se dokončil ten předchozí, jinak se můžeš dostat do problémů.
TomasJ
Profil
//PHP skript  udp.php:
  //tady mam vytvoreni socketu a pripojeni
while(true){
  @socket_recv($sock,$buff,180,MSG_WAITALL);
  if($buff=="is-alive") @socket_send($sock,"keep-alive",10,0);
  else echo $buff;
  usleep(50000);
}

//JS skript:
function LoadChat(){
  var xhr = (typeof window.ActiveXObject != "undefined" ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest());
  xhr.open("GET","udp.php",true);
  var e = document.getElementById("frame");
  xhr.onreadystatechange = function(){
    if(xhr.status==200 && xhr.responseText){
      e.innerHTML = xhr.responseText;
      if(xhr.readyState==4){
        setTimeout(LoadChat,10000);
      }
    }
  }
  xhr.send();
}
Takto to vypadá... Po načtení stránky se spustí LoadChat().

EDIT: Nakonec to tedy vyřeším tak, že budu přes ajax posílat udržovací packet a na udp serveru budu porovnávat, jestli uživatel s takovým nickem je v seznamu, a když ano, tak obnovím spojení. Když nepřijde packet do určitého času, odpojím uživatele v seznamu.
Díky za pomoc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0