Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Intervallo tra due XMLHttpRequest in JavaScript

Linguaggi e sistemi

Moderatori: Foto UtenteMassimoB, Foto UtentePaolino, Foto Utentefairyvilje

1
voti

[1] Intervallo tra due XMLHttpRequest in JavaScript

Messaggioda Foto Utenteboiler » 11 nov 2020, 12:14

Ciao a tutti

EDIT: problema semi-risolto, vedi post successivo.

Sto cercando di aggiornare una pagina in HTML usando JavaScript e dei dati in formato JSON.

Codice: Seleziona tutto
<!DOCTYPE html>
<html>
<body>

<div id="demo"><p>---</p></div>

<button type="button" onclick="loadJSON()">Update</button>

<script type = "application/javascript">
   function loadJSON() {

           var data_file = "http://XXXXXXXXX:13000";

           var http_request = new XMLHttpRequest();
         
           http_request.onreadystatechange = function() {
         
               if (http_request.readyState == 4  ) {
                  // Javascript function JSON.parse to parse JSON data
                  var jsonObj = JSON.parse(http_request.responseText);

                  // jsonObj variable now contains the data structure and can
                  // be accessed as jsonObj.name and jsonObj.country.
                  document.getElementById("demo").innerHTML = jsonObj.time;

               }
            }
   
            http_request.timeout = 50;   
            http_request.open("GET", data_file, true);
            http_request.send();

         }
   
      </script>

</body>
</html>


Il comportamento è curioso:
  • premo il bottone per l'aggiornamento dei dati --> i dati vengono aggiornati
  • premo nuovamente il bottone --> non succede nulla
  • premo una terza volta il bottone --> i dati vengono aggiornati
e così via. Tra due richieste consecutive aspetto un paio di secondi. Se invece lascio scorrere piú tempo (parliamo di diversi minuti) funziona tutte le volte.

Il motivo per cui nelle volte pari non succede nulla è che non c'è risposta da parte del server.
Non c'è risposta da parte del server, perché il server non riceve nessuna richiesta ?%

Il server è un servizio Windows scritto in C# da me.
Accetta connessioni usando il metodo BeginAcceptTcpClient della classe TcpListener. Quando riceve una connessione chiama una funzione callback che a sua volta richiama BeginAcceptTcpClient per permettere piú connessioni contemporanee. La prima linea della funzione di callback genera un Log nell'EventViewer di Windows.

Quando l'update sulla pagina HTTP fallisce, non vedo nessun Log nell'EventViewer, cosa che mi porta a credere che non sia stata generata nessuna richiesta all'indirizzo del server (o che questa sia andata persa da qualche parte).

Questo servizio mi sembra funzionare bene: se invece di usare JavaScript chiamo l'indirizzo che fornisce i dati JSON direttamente nel browser, ottengo ogni volta una risposta, anche aggiornando in modo rapido la pagina.

Ad ulteriore conferma ho scritto un piccolo programma (sempre C#) che richiede i dati in modo estremamente aggressivo:
Codice: Seleziona tutto
for (int iii = 0; iii < 1000; iii++)
{
   Console.WriteLine("\n" + DateTime.Now.ToLongTimeString() +"."+ DateTime.Now.Millisecond.ToString());
   
   Int32 port = 13000;
   string server = "XXXXXXXXX";

   TcpClient client = new TcpClient(server, port);
   NetworkStream stream = client.GetStream();

   data = new Byte[256];

   System.Threading.Thread.Sleep(10);

   int index = 0;
   while (stream.DataAvailable)
      stream.Read(data, index++, 1);

   for (int ii = 0; ii < index; ii++)
      Console.Write((char)data[ii]);

   stream.Close();
   client.Close();
}


Il risultato è questo, ripetuto mille volte:
Codice: Seleziona tutto
10:43:50.574
HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Origin: *
Content-Length: 21

{"time":"10:43:50"}

10:43:50.588
HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Origin: *
Content-Length: 21

{"time":"10:43:50"}

Dalla differenza tra i timestamps si vede che il servizio è in grado di rispondere entro 14 ms ad una richiesta.

Questo mi porta a pensare che il problema sia sul lato JavaScript, ma d'altra parte, se sostituisco la definizione di data_file come segue
Codice: Seleziona tutto
var data_file = "json_info.txt";

il problema non si presenta: ad ogni pressione del bottone, pari o dispari che sia, ottengo una risposta.
Il file statico si trova sulla stessa macchina sulla quale gira il servizio, ma è servito da IIS.

Avete un'idea su cosa potrei guardare/debuggare?
I test sul servizio mi portano a pensare che questo funzioni correttamente.
Ma il test con il file di testo come sorgente JSON mi porta a pensare che invece sia il JavaScript ad essere corretto ||O

Boiler
Avatar utente
Foto Utenteboiler
18,0k 5 7 13
G.Master EY
G.Master EY
 
Messaggi: 3334
Iscritto il: 9 nov 2011, 12:27

1
voti

[2] Re: Intervallo tra due XMLHttpRequest in JavaScript

Messaggioda Foto Utenteboiler » 11 nov 2020, 13:49

Mi sono accorto che se faccio un update e questo funziona, poi ricarico la pagina HTTP e faccio un altro update, questo fallisce. Significa che il problema non è qualcosa di collegato alla "sessione" di JavaScript.

Non sapendo bene che pesci pigliare ho modificato il service in modo che 3 millisecondi dopo aver mandato i dati JSON, chiude attivamente lo stream e la connessione.
Non l'avevo fatto dall'inizio perché dai miei arrugginiti ricordi di teoria delle reti, dovrebbe essere l'iniziatore della connessione TCP a mandare il pacchetto FIN.

Ad ogni modo, con questa modifica funziona tutto correttamente :ok:

Lascio così o c'è la possibilità di implementare in JavaScript la chiusura della connessione? (che mi sembrerebbe una soluzione piú pulita)

Boiler
Avatar utente
Foto Utenteboiler
18,0k 5 7 13
G.Master EY
G.Master EY
 
Messaggi: 3334
Iscritto il: 9 nov 2011, 12:27

0
voti

[3] Re: Intervallo tra due XMLHttpRequest in JavaScript

Messaggioda Foto Utenteluxinterior » 11 nov 2020, 14:31

Sembra un lavoro per wireshark hai l'analisi dettagliata di tutto il traffico
Qualcosa puoi vedere anche facendo debug con firefox almeno se la richiesta parte e il server non risponde.
Avatar utente
Foto Utenteluxinterior
3.023 2 4 8
Expert EY
Expert EY
 
Messaggi: 1798
Iscritto il: 6 gen 2016, 17:48


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti