Newsgroup: it.comp.lang.javascript
Titolo: utlizzare un flusso di dati

avrei bisogno di utilizare un flusso di dati collocato su internet generato con questo comando:
 
while true; do nc -l -p80 -q1 --send-only</dev/arduino ;done
 
il formato del flusso consiste in una successione di righe, ciascuna contenente tre numeri.
 
Avrei bisogno di creare un programma capace di leggere il flusso e generare dinamicamente dei grafici.
In pratica, mi basterebbe leggere in modo sequenziale il flusso ed eseguire una funzione javascript che crea un oggetto specifico per ogni numero acquisito in input.
 
Come si può fare?


Non credo si possa in questo modo.
 
Puoi utilizzare i WebSocket, ma devi scriverti un server apposito che usa 
il protocollo corretto.  Non dovrebbe essere troppo difficile.
 
Cercando "websocket server in Python" sono venuti fuori molti risultati, 
come:
http://stackoverflow.com/questions/5839054/websocket-server-in-python
 
 
 
Ciao  Manlio

 
 
mmm. peccato.
il fatto è che riesco già a ricevere il flusso che mi serve, sebbene non sia capace di gestirlo nella pagina web.
 
i websockets mi sembrano costruiti per interazioni più complicate di quelle che servono a me.
 
in ogni caso, faccio un po' di fatica a seguire le documentazioni che mi hai segnalato. scarico dei software, ma poi non capisco bene come avviarli in modo efficente.
Esiste qualche howto completo che illustra la tecnologia dei websockets?

 while true; do nc -l -p80 -q1 --send-only</dev/arduino ;done
 
Specifica "collocato su internet". Il problema fondamentale, qui, sta
nella SOP ï¿½ Same Origin Policy
(
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript
)
 
Quindi se questo comando gira su un server remoto, e vuoi accedere alla
sorgente di questi dati tramite una pagina web che sta sullo stesso
indirizzo, qualcosa puoi fare. Ovviamente, deve essere mandato un flush
ogni tanto, oppure devi usare browser moderni che possono anche prendere
chunk di risposta, e non risposte complete. Potrebbe anche bastarti
l'oggetto XMLHttpRequest, in tal caso ï¿½ che ha dispetto del nome, non ha
a che vedere con XML e basta:
 
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
 
 

ottimo.
 
mentre aspettavo la risposta di Zero, sono riuscito a generare un accrocchio dimostrativo relativamente semplice basato su ws4py + cherrypy, partendo da un esempio di patch che ho trovato su questo git:
 
git://
github.com/Lawouach/WebSocket-for-Python
 
 
tutta la patch che mi è servita è la seguente:
 
cloc3@dell ~/websocket $ diff -ruN WebSocket-for-Python.orig
WebSocket-for-Python
diff -ruN WebSocket-for-Python.orig/example/echo_cherrypy_server.py
WebSocket-for-Python/example/echo_cherrypy_server.py
--- WebSocket-for-Python.orig/example/echo_cherrypy_server.py   2013-11-30
19:01:16.047001532 +0100
+++ WebSocket-for-Python/example/echo_cherrypy_server.py        2013-11-30
20:16:21.606017400 +0100
@@ -1,3 +1,5 @@
+#!/usr/bin/python
+
 # -*- coding: utf-8 -*-
 import argparse
 import random
@@ -11,6 +13,9 @@
 
 class ChatWebSocketHandler(WebSocket):
     def received_message(self, m):
+        inFile=open("/dev/arduino","r")
+        m=inFile.read(4)
+        inFile.close()
         cherrypy.engine.publish('websocket-broadcast', m)
 
     def closed(self, code, reason="A client left the room without a proper
explanation."):
 
a questo punto, penso di avere due strade differenti per raggiungere il mio risultato.
grazie.

 [...]
 
 
Ciao  Manlio

 [...]
 
 
Ciao  Manlio

 *
 
grazie ancora.
 
anche io ho voluto fare qualche prova ulteriore con le richieste html verso il server nc, ma il problema non mi sembra risiedere né nella Some-Origing-Policy (il server riceve la richiesta), né nel formato della risposta (trasformare il flusso infinito in una successione di pacchetti, includendo nc in un while non sarebbe difficile).
 
il guaio è che, se il client (cioè firefox) lancia una xmlHttpRequest, poi attende un header ben formato di risposta, altrimenti non imposta il readyState necessario. così la risposta viene perduta.
 
forse potrei istruire nc a premettere un header ben formato.
ma a questo punto, temo che la complessità oltrepassi le mia attese.
Se proprio devo schiacciare il granello di senape con un maglio, tanto vale usare cherrypy.
 
ci penserò...

 
 
Se stai imparando cherrypy, continua pure.
Ma è davvero banale scrivere un server HTTP 1.1 minimale, in qualsiasi 
linguaggio.
 
 
Ciao  Manlio


chiaramente no :).
comunque, ragionando sperimentalmente è certo nc riceve la richiesta perché la stampa su terminale. Invece, firefox dichiara di non ricevere alcuna risposta di ritorno (si può consultare la console nel menù strumenti).
 
un tcpdump degli scambi mostra l'esistenza di un dialogo tra server e client. io non so leggere completamente l'output di tcpdump, ma mi sembra che il client riceva una risposta.
 
 12:39:47.166618 IP6 localhost.8000 > localhost.56517: Flags [S.], seq 992660147, ack 875390514, win 43690, options [mss 65476,sackOK,TS val 2433496 ecr 2433496,nop,wscale 7], length 0
12:39:47.166630 IP6 localhost.56517 > localhost.8000: Flags [.], ack 1, win 342, options [nop,nop,TS val 2433496 ecr 2433496], length 0
12:39:47.166873 IP6 localhost.8000 > localhost.56517: Flags [P.], seq 1:14, ack 1, win 342, options [nop,nop,TS val 2433496 ecr 2433496], length 13
12:39:47.167069 IP6 localhost.56517 > localhost.8000: Flags [.], ack 14, win 342, options [nop,nop,TS val 2433497 ecr 2433496], length 0
12:39:47.171890 IP6 localhost.56517 > localhost.8000: Flags [P.], seq 1:360, ack 14, win 342, options [nop,nop,TS val 2433501 ecr 2433496], length 359
12:39:47.171898 IP6 localhost.8000 > localhost.56517: Flags [.], ack 360, win 350, options [nop,nop,TS val 2433501 ecr 2433501], length 0
12:39:47.174417 IP6 localhost.56517 > localhost.8000: Flags [F.], seq 360, ack 14, win 342, options [nop,nop,TS val 2433504 ecr 2433501], length 0
12:39:47.174460 IP6 localhost.8000 > localhost.56517: Flags [F.], seq 14, ack 361, win 350, options [nop,nop,TS val 2433504 ecr 2433504], length 0
12:39:47.174471 IP6 localhost.56517 > localhost.8000: Flags [.], ack 15, win 342, options [nop,nop,TS val 2433504 ecr 2433504], length 0
12:40:06.794824 IP localhost.49888 > localhost.http: Flags [F.], seq 3165, ack 1625, win 409, options [nop,nop,TS val 2453124 ecr 2432478], length 0
12:40:06.794955 IP localhost.http > localhost.49888: Flags [F.], seq 1625, ack 3166, win 409, options [nop,nop,TS val 2453124 ecr 2453124], length 0
12:40:06.794966 IP localhost.49888 > localhost.http: Flags [.], ack 1626, win 409, options [nop,nop,TS val 2453124 ecr 2453124], length 0
 
se indirizzo il browser a chiamare in diretta la porta 8000 (cioè il client nc), firefox riconosce la risposta come text/plain e la acquisisce. Questo è l'output di tcpdumo è questo:
 
12:47:34.177466 IP6 localhost.57317 > localhost.8000: Flags [S], seq 1373364128, win 43690, options [mss 65476,sackOK,TS val 2900507 ecr 0,nop,wscale 7], length 0
12:47:34.177477 IP6 localhost.8000 > localhost.57317: Flags [S.], seq 44548429, ack 1373364129, win 43690, options [mss 65476,sackOK,TS val 2900507 ecr 2900507,nop,wscale 7], length 0
12:47:34.177488 IP6 localhost.57317 > localhost.8000: Flags [.], ack 1, win 342, options [nop,nop,TS val 2900507 ecr 2900507], length 0
12:47:34.177813 IP6 localhost.8000 > localhost.57317: Flags [P.], seq 1:14, ack 1, win 342, options [nop,nop,TS val 2900507 ecr 2900507], length 13
12:47:34.178013 IP6 localhost.57317 > localhost.8000: Flags [.], ack 14, win 342, options [nop,nop,TS val 2900507 ecr 2900507], length 0
12:47:34.199471 IP6 localhost.57317 > localhost.8000: Flags [P.], seq 1:306, ack 14, win 342, options [nop,nop,TS val 2900529 ecr 2900507], length 305
12:47:34.199481 IP6 localhost.8000 > localhost.57317: Flags [.], ack 306, win 350, options [nop,nop,TS val 2900529 ecr 2900529], length 0
12:47:35.178888 IP6 localhost.8000 > localhost.57317: Flags [F.], seq 14, ack 306, win 350, options [nop,nop,TS val 2901508 ecr 2900529], length 0
12:47:35.179619 IP6 localhost.57317 > localhost.8000: Flags [F.], seq 306, ack 15, win 342, options [nop,nop,TS val 2901509 ecr 2901508], length 0
12:47:35.179637 IP6 localhost.8000 > localhost.57317: Flags [.], ack 307, win 350, options [nop,nop,TS val 2901509 ecr 2901509], length 0

bene.
 
sembra che posso riuscire a scambiare dati con il browser usando questo semplice script:
 
cloc3@dell ~/adxlWeb $ cat risposta.sh
#!/bin/sh
handle_req()
{
        #read req file proto
        echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nAccess-Control-Allow-Origin: *\r\nKeep-Alive: timeout=2, max=100\r\nConnection: Keep-Alive\r\nContent-Type: plain/text\r\n\r\n"
        #echo -e "<html><h1>Hello World</h1></html>"
        cat prova.txt
 
}
typeset -fx handle_req
while true;do nc -l -p 8000 -e handle_req -q1 ;done
 
per la verità, è un pochino più complesso di quello che speravo, ma forse è meglio del server python.