Newsgroup: it.comp.java
Titolo: servlet streaming...

ciao a tutti
devo realizzare un applicazione che effettua uno streaming di dati tra un 
server ed un client.
per la parte client penso di scrivere un'applet per la perte server pensavo 
di creare una servlet che una volta connesso mi invia in continuazione dei 
dati... cosa ne pensate, secondo voi e' fattibile?!?
la daomanda nasce dal fatto che una servlet mi pare piu una cosa che fatta 
una domanda da in risposta generalmente un file di qualche tipo.
qui invece ho necessita di fatta una damanda e di incominciare a ricevere 
un flusso di dati... inoltre c'e' la possibilita di inviare una seconda 
richiesta per cambiare i paremetri...io continuo con gli esperimenti ma se 
qualcuno sa qualcosa mi aiuterebbe non poco...
saluti
  bEPpE

Tempo fa sviluppai un sistema di push su internet: ti consiglio solo di assicurarti che ci
sia un "hartbeat", ovvero che ogni tot secondi il server invii un messaggio nullo al
client solo per far sapere a tutti quelli in mezzo (firewall, proxyes, server vari) che il
dialogo continua.
Noi comunque per parlare dall'applet verso il server usavamo un canale parallelo, mentre
c'era effettivante dal server al client un "tubo" sempre aperto.
Per la parte applet->server puoi dare un'occhiata a GMI sul mio sito, per la parte
server->applet se vuoi ne discorriamo un po qui sul NG
Ciao,
    Bruno.
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola

 per la parte server->applet se vuoi ne discorriamo un po qui sul NG
ti pentirai di questa gentilezza verrai tormentato delle mie domande giorno  
e notte :))) 
ciao ciao 
   bEPpE



Le aspetto! Per ora comunque posso darti un consiglio: astrai tutto il casino della
comunicazione, e scrivi diverse implementazioni del protocollo di trasporto, una per
internet e una per rete locale. (in pratica ti sto consigliando la soluzione che abbiamo
usato noi e che ha funzionato :-D). 
Separa il cosa dal come.
Tanto per farti un esempio, ecco l'insieme delle interfacce nostre che astrevano il
protocollo di comunicazione. Lo so, e' un po' complicata ma rende l'idea:
public interface PushServiceFactory
{
    PushService getPushService
        (
            String theConcreteName,
            Properties theProperties
        )
        throws PushException
    ;
}
public interface PushService
{
    void start() throws PushException
    ;
    void stop() throws PushException
    ;
    ChannelFactory getChannelFactory() throws PushException
    ;
    boolean isStarted() 
    ;
}
public interface ChannelFactory
{
    Channel getChannel(ChannelID aChannelID) throws PushException
    ;
}
public interface Channel
{
    void addConsumer(ChannelConsumer consumer) throws  PushException
    ;
    void removeConsumer(ChannelConsumer consumer) throws  PushException
    ;
    PushableData getSnapshot(String session) throws PushException
    ;
 
    ChannelID getChannelID()
    ;
}
public interface ChannelConsumer extends java.util.EventListener  
{
    void dataReceived(PushableData data)
    ;
}
Come funzionava il tutto? Il client prima di tutto richiedeva un PushService dalla
relativa factory, e quindi da quello otteneva la ChannelFactory, mediante la quale
otteneva i Channel (canali). Questi sono canali "logici", non fisici, ciascuno con un ben
determinato identificativo. Nel caso della nostra applicazione di trading noi avevamo un
canale per ogni titolo, uno per ogni tasso di cambio, e cosi' via. 
Quindi il client si registrava come consumatore del canale, startava il PushService e
uala', cominciava a ricevere dati.
Di questo insieme di intefacce ne esistevano diverse implementazioni, di cui una per
uscire su internet: quest'ultima usava un'unico canale fisico (il "tubo", ovvero la
connessione HTTP persistente con hartbeat verso una servlet) sulla quale transitavano i
dati di tutti i canali che poi venivano dispacciati ai singoli canali logici.
Un po' complicato, no? Ma funzionava bene :-D, ed e' una astrazione sufficientemente
aperta al cambiamento da poter essere "quasi" riusabile: ma secondo me deve ancora
maturare un po'. Comunque, ora e' dismessa, quindi... :-) Si potrebbe anche tentare di
fare un progetto open-source, ma in questo periodo il mio tempo e' zero (e magari qualcosa
c'e' gia', chissa!). Comunque se partisse mi offro come collaboratore puramente "di
pensiero" :-D
