Newsgroup: it.comp.java
Titolo: [Esempio] Push applet - servlet

Ciao a tutti,
   a seguito di un paio di richiesta sul NG ho deciso di fare un piccolo esempio di push
realizzato mediante l'utilizzo di applet e servlet (e HTTP). Questo ovviamente e' molto
semplice, ma puo' costituire un embrione di una futura libreria di push open-source: chi
fosse interessato a svilupparla puo' contattarmi via mail, se ricevero' un numero
sufficiente di  richieste potremo iniziare a pensare di sviluppare qualcosa insieme,
magari un progetto su sourceforge (se non c'e' gia' :-D) 
   Al di la' di questo, costituisce comunque un esempio che vi indica una strada possibile
per realizzare il push nel vostro personale sistema: se avete in mente di fare una cosa
simile, vi suggerisco caldamente di darci un'occhiata!
Il tutto lo trovate per ora qui:
http://digilander.iol.it/bbossola/projects/push/
   Mi scuso pubblicamente con tutti gli altri che ho ignorato per fare questo: Cristiano
(per il chilometrico post), il JUG di Torino (per il deployment del wiki e la
pianificazione dell'incontro), ecc.ecc., ma ogni tanto si deve fare, va' dove ti porta il
cuore!
A risentirci!
Ciao,
    Bruno.
 
---
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola

     Bruno.
Ciao
Lis
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 in generale nessuno su digilander.
  io non ho problemi.......ad prire il sito :))

 HTTP). 
Mi dai una forma canonica della domanda, cosi' la aggiungo alla FAQ con il 
link come risposta? :-)
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 
http://digilander.iol.it/bbossola/projects/push/
Ok, sto cercando di provarlo ma ho qualche problema, non capisco se di
configurazione di Tomcat o altro.
Sono riuscito a fare in modo che dal browser, con
http://localhost:8080/push/servlets/index.html
 (dove index è la tua
pagina html) venga avviata l'applet.
Tomcat sembra ok perchè dalla sua finestra di log si vede che arrivano
le chiamate dall'applet (2002-04-02 11:04:33 - Ctx(  ): 400 R( /) null)
A questo punto però guardando la console java, fa una serie si
System.out....
init()
start()
Opening connection to '
http://localhost:8080/push/servlet/PushServlet
'
Postin session ID... (1017738272787)
...e quindi mi ritorna questa eccezione:
java.net.ProtocolException: Can't reset method: already connected
	at java.net.HttpURLConnection.setRequestMethod(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown
Source)
	at PushApplet.pushStart(PushApplet.java:48)
	at PushApplet.start(PushApplet.java:21)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Qualche suggerimento da darmi?? Grazie



Analizzando lo stacktrace() dell'eccezione lato client, sembra che il client imponga delle
proprieta' sulla connessione dopo averla aperta. Direi potresti provare a modificare il
codice della connect() dell'applet eliminando la chiamata al metodo connect() di
connection. Il tuo codice diventa quindi cosi':
private URLConnection connect(String servletAddress) throws IOException
{
   URL servletURL = new URL 
        (
            getCodeBase().getProtocol(),
            getCodeBase().getHost(),
            getCodeBase().getPort(),
            servletAddress
        );
 
    System.out.println("Opening connection to '"+servletURL+"'");
 
    URLConnection connection = servletURL.openConnection();
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    // connection.connect();   va commentata questa istruzione!
 
    return connection;
}
Okay, comunque cerchiamo di individuare il motivo del problema:
1. usi il java plugin?
2. che browser utilizzi?
3. se fai una GET alla servlet, ovvero visiti con il browser
http://localhost:8080/push/servlet/PushServlet
, risponde?
Facci sapere!
Ciao,
    Bruno.
P.S.
Per chi si e' appena sintonizzato, stiamo provando un sistema di push basato su applet /
servlet di cui ho fatto uno spike: tutto il codice lo trovate a questo URL:
http://digilander.iol.it/bbossola/projects/push/


     Bruno.
Grazie, ora vado a cercare di configurare correttamente Tomcat e così
vediamo se finalmente funziona tutto il sistema ;-)


Questo tipo di soluzione e' compatibile con qulasiasi browser?
Ciao
-- 
             -=( |LnZ| )=- Lorenzo Porro
        e-mail: lnz@{aT}
iname.com
        Home-Page: 
http://lnz.cjb.net
	ettercap project: 
http://ettercap.sourceforge.net
 

 guardato sul sito di apache e dice che è un "servlet container".
Mi rispondo da solo....fa anche da Web Server ma non è veloce, potente,
affidabile e sicuro come, ad esempio, Apache



Qualunque browser che supporti almeno una Java virtual machine 1.1
Comunque se volete posso chiedere il permesso di metterlo su internet, cosi' chi puo' lo
prova e ci dice le impressioni.
Ciao,
    Bruno.



Facci sapere!
Ciao,
    Bruno.


     Bruno.
Ciao



Lo so, me ne sono accorto pure io :-(
Adesso l'applet comunque funziona?
Facci sapere.



Si, la lavoriamo ancora un poco e poi postiamo, ok?


 Adesso l'applet comunque funziona?
Ok, non so bene neanche io come ma, ritornando a Tomcat 3.2 per
configurarlo a mano, adesso funziona sia con che senza utilizzare il
plug-in Sun.
Ora non mi resta che studiare il codice per adattarlo alle mie esigenze.
Grazie 1000, se vi interessa vi farò sapere come procedono i lavori ;-)


:-)
Bruno,
Io ho scaricato (e installato) Tomcat 4.0.3. Quando lo faccio partire  per 
installare il .war mi crea la dir push sotto web-apps, ma vuota (??).
Facendo l'installazione a manina l'applet riesco a vederla (ho fatto la 
modifica da te suggerita al metodo connect), ma la servlet non mi risponde.
Poiche' sono abbastanza nuovo del "ramo" (intendo dire di Tomcat), ecco cosa 
ho fatto:
- dir push in webapps\examples\
- copy file *html e .class dell'applet in dir push
- copy file altri class in webapps\examples\WEB-INF\classes
ma la servlet non mi risponde comunque. :((
C'aggia a fa??
ciao domenico
PS
C'e un modo standard per vedere il contenuto dei file .war?? Io pensavo 
banalmente winzip, ma il tuo si rifiuta di aprirlo...
-- 
"We reject Kings, presidents and voting
 we believe in rough consensus and running code"
	-Dave Clark
--

 banalmente winzip, ma il tuo si rifiuta di aprirlo...
Prova a rinominarlo in .zip......



No, allora l'hai scaricato male, winzip lo apre.


Mi dispiace dover postare che:
ho provato l'esempio su weblogic e quando l'applet cerca di aprire lo stream
per la lettura dei dati in push ottengo lato server
java.io.StreamCorruptedException: Caught EOFException while reading the
stream header
 at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:845)
 at java.io.ObjectInputStream.<init>(ObjectInputStream.java:168)
 at PushServlet.doPost(PushServlet.java:21)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:772)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:865)
 at
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java
:123)
 at
weblogic.servlet.internal.ServletContextImpl.invokeServlet(ServletContextImp
l.java:761)
 at
weblogic.servlet.internal.ServletContextImpl.invokeServlet(ServletContextImp
l.java:708)
 at
weblogic.servlet.internal.ServletContextManager.invokeServlet(ServletContext
Manager.java:252)
 at
weblogic.socket.MuxableSocketHTTP.invokeServlet(MuxableSocketHTTP.java:346)
 at weblogic.socket.MuxableSocketHTTP.execute(MuxableSocketHTTP.java:246)
 at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:135)
mer apr 03 13:52:29 GMT+02:00 2002:<E> <ServletContext-General> Servlet
failed with ServletException
javax.servlet.ServletException: [PushServlet] Unable to read session ID!
 at PushServlet.doPost(PushServlet.java:28)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:772)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:865)
 at
weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java
:123)
 at
weblogic.servlet.internal.ServletContextImpl.invokeServlet(ServletContextImp
l.java:761)
 at
weblogic.servlet.internal.ServletContextImpl.invokeServlet(ServletContextImp
l.java:708)
 at
weblogic.servlet.internal.ServletContextManager.invokeServlet(ServletContext
Manager.java:252)
 at
weblogic.socket.MuxableSocketHTTP.invokeServlet(MuxableSocketHTTP.java:346)
 at weblogic.socket.MuxableSocketHTTP.execute(MuxableSocketHTTP.java:246)
 at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:135)
Che ne dici Bruno?
--
*************************************
          Andrea Musumeci
             programmatore
             java free lance
 
http://www.javalab.it
http://www.fauser.it/olimpo76
*************************************

 No, allora l'hai scaricato male, winzip lo apre.
Rispondo a entrambi qui. Grazie per l'aiuto.
Bruno, winzip continua a dirmi che il file war e' corrotto (l'ho appena 
riscaricato, non so...)
Lis, rispetto alla configurazione che mi hai consigliato, io sono riuscito a 
far funzionare tutto sostituendo la riga
   docBase="webapps/push" 
con
   docBase="push" 
 
grazie a entrambi. Adesso ci smanetto un po' e piu' tardi vi dico
ciao domenico
PSper bruno
mi sa che siamo "vicini" di ufficio... centro PDF ti dice niente? :))
ciao ciao


 Adesso l'applet comunque funziona?
Oltre ad apparire non correttamente non funziona l'aggiornamento verso
il server: viene eseguito ciň che č contenuto nell'actionListener (ho
provato con delle Out), ma il server non le "sente". Ho provato sia con
il JRE 1.3 che con il 1.4 appena scaricato.
Effettivamente Tomcat si comporta diversamente nei 2 casi: quando si
vuole aggiornare il contatore senza il plugin segnala:
--
[PushSystem] Writing '18'
[PushSystem] Writing '19'
[PushManagerServlet] Reading session ID...
[PushManagerServlet] Ok! Session ID: 1017840148968
[PushManagerServlet] Posting output...
[PushManagerServlet] Done!
[PushSystem] Writing '1001'
[PushSystem] Writing '1002'
--
mentre utilizzando il plug-in:
--
[PushSystem] Writing '69'
[PushSystem] Writing '70'
2002-04-03 15:16:16 - Ctx(  ): 400 R( /) null
2002-04-03 15:16:16 - Ctx(  ): 400 R( /) null
[PushSystem] Writing '71'
[PushSystem] Writing '72'
--
Ho provato anche a cambiare l'applet in JApplet (e facendo diventare
anche gli altri componenti degli swing) ma il risultato non cambia.
In compenso ho provato anche con 4 applet contemporaneamente e funziona
egregiamente (ovviamente senza plugin)



Si. l'ho visto, e' semplice da mettere a posto. In pratica il plugin non chiude
correttamente la connessione HTTP se tu non gli spedisci qualcosa indietro.
Quando modifichi lo stato del contatore sul server invii i dati su una connessione HTTP
che per il plugin _deve_ ricevere una risposta: e' sufficiente che tu modifichi il client
ed il server in modo che ci sia un colloquio qualsiasi. Io l'ho fatto e funziona tutto,
ho messo la nuova versione sempre sul mio sito: scaricala e provala.
Nel frattempo ho messo in "produzione" un'istanza dell'esempio, dovreste riuscire ad
accedervi da questo URL:
http://www.mycgiserver.com/~bbossola/PushApplet.html
Adesso tutte le classi si trovano nel package bbossola: non e' narcisismo, e' che e'
richiesto da mycgiserver :-)
Mi raccomando, non lo caricate troppo altrimenti mycgiserver si scassa e mi fanno il culo
a cubetti :-D, e tenete anche conto che, per politica di mycgiserver, dopo un tot di
staccano di brutto la connessione, quindi piu' di tanto non va.
Inolte con mycgiserver ed il plugin c'e' un altro problema: mycgiserver imposta di fisso
il content-length della connessione http, e il plugin reagisce bufferizzando la
connessione: e' stato necessario fare un barbatrucco :-) (che con tomcat come server non
e' assolutamente necessario) che fa in modo che la content-length sia impostata ad un
valore talmente alto che il plug-in si spaventa :-) e non bufferizza un tubazzo! (vabbe',
ho usato una metafora :-D)
Sicuramente i problemi non sono finiti, ma ci stiamo avvicinando!
Ciao,
    Bruno.



Azz! Sto aiutando la concorrenza! Dai, in che ditta lavori? Andiamo a farci un boccone
insieme! Non mi vorrai mica fare una ricerca su internet, orsu', svela il mistero!
Ciao,
    Bruno.
P.S.
Se mi dici Atos ti strozzo :-D



La parte piu' intricata di questi sistemi e' solitamente il server (lo so per esperienza,
ne ho fatto almeno uno :-D): quando nascono necessita' di fault tolerance, load balancing,
migliaia di utenti... altro che questi problemi! 
Comunque continuiamo a sentirci sul NG, vediamo i progressi che facciamo.


Se mi dici Atos ti strozzo :-D
Ma č davvero cosě piccolo il mondo
dell'informatica?? Gira e rigira i nomi alla fine sono sempre quelli  :-
DDDDD
Ciao
Lis
--------------------------------
Inviato via 
http://usenet.iol.it
 

 staccano di brutto la connessione, quindi piu' di tanto non va.
Provato e funziona alla grande, che bella notizia ;-)
Adesso torno a ristudiarmi il codice con le modifiche....



Uhm... piu' che altro esperienza (te l'ho detto che un sistema analogo l'ho gia' fatto) ma
nel caso specifico ho notato mediante delle stampe che la risposta veniva processata
correttamente dal server ma non sul client, poi mi sono "ricordato" che il protocollo http
ritorna sempre qualcosa, ho verificato che con IE funzionava, ho pensato che come al
solito il plugin (pistino!) volesse la risposta, ho provato, e uala'.


 Se mi dici Atos ti strozzo :-D
Ti ho risposto in mail per il boccone insieme. :) 
Comunque rassicuro tutti sulla sorte mio collo: non di Atos si tratto'! ;-)
ciao domenico


 solito il plugin (pistino!) volesse la risposta, ho provato, e uala'.
Ah, ecco....l'esperienza spesso vale più di un titolo.....magari un
giorno potrò ricambiare con una consulenza di Cobol (o VB) ;-)))


 
http://digilander.iol.it/bbossola/projects/push/
Analizzando il codice ho trovato delle cose che mi sono poco chiare,
potresti darmi qualche spiegazione?
1) Nella classe PushSystem c'è questa dichiarazione che non avevo mai
visto prima:
private static final PushSystem system = new PushSystem();
in sostanza a cosa serve? Crecando di ragionare su come viene utilizzata
direi che fa in modo che la classe venga istanziata la prima volta che
viene utilizzata e poi resta a disposizione di tutti gli oggetti che ne
hanno bisogno, giusto? Se è così pensavo di utilizzare lo stesso
meccanismo per i 2 oggetti che si occupano di accedere al database e per
la gestione della configurazione dei client. Pensavo di fare così perchè
sono 2 funzioni che vengono usate molto poco, per cui mi sembra inutile
aprire una connessione al db per ogni applet che si collega.
2) La classe PushServer è necessaria oppure è stata creata per questioni
di ordine e pulizia del progetto? In teoria no sarebbe stato possibile
mettere tutto nella classe PushServlet? Non ho intenzione di farlo, ma è
solo per cercare di capire meglio...
3) nella classe PushServer utilizzi la parola chiave Transient che ho
visto che serve per non far serializzare il valore di quella variabile.
Anche in questo caso, era necessario oppure è semplicemente una finezza,
visto che la classe non implementa l'interfaccia Serializable?
Grazie



Transient??? Azz! No, sbagliai, (vedi a scrivere le cose di fretta!) serve invece
"volatile" per indicare che quella variabile puo' cambiare in modo asincrono nel rispetto
del thread che vi accede: in questo modo il compilatore non fa ottimizzazioni varie.


     Bruno.
Ciao
Lis
ps. ci risentiamo martedě, sono di nuovo via per un ponte lungo :)


 A risentirci!



Qui si possono scegliere due direzioni: o realizzare una libreria per fare il push anche
su internet oppure realizzare un middleware ex-novo, prendendo spunto ad esempio dal mio
GMI (lo trovi sul mio sito, in pratica un mini-RMI che funziona su HTTP, con generazione
di stub e skel via compilatore) o partendo da zero.
Dimmi tu, io se vuoi un po' di tempo ce l'ho. Secondo me la cosa piu' semplice per ora e'
realizzare una libreria per il push, poi si vede.
Fammi sapere.


Ok... ci ho riflettuto: credo che per il momento sia meglio realizzare
soltanto la libreria per il push e capire se in effetti le connessioni http
vengon chiuse a piacere a seconda di chi ha scritto l'application server
oppure se esistono delle standardizzazioni in merito...
Comunque ottimo lavoro!



Sono d'accordo. Chi si candida?


     Bruno.
Ciao
Lis


     Bruno.
Ciao
Lis
ps. non so se hai ricevuto un numero di adesioni sufficienti, ma se il
progetto è partito mi piacerebbe esserne informato, in modo da poter
seguire tutta la fase di progettazione e sviluppo di una libreria; dato
che non saprei da che parte cominciare, sarebbe un'ottima occasione per
impararlo.



Sto raccogliendo adesioni, ma per ora siamo noi tre :-)
Direi che fra poco si parte e bon!


 ha scritto nel messaggio
news:3cbaece5...@news.inet.it...



Eh, esempio... ho in mano tutto il codice di un sistema di push funzionante e che abbiamo
sviluppato nel mio impiego precedente all'attuale, ma non posso usarlo per ovvi motivi
etici (e non). Quello che posso fare e' rendere disponibile la mia esperienza a coloro che
vogliono affrontare il problema, ed e' quello che sto cercando di fare. 
Comunque se tu hai tempo di sviluppare un po' (anche un paio d'ore la settimana) possiamo
startare il progetto ed iniziare a lavorarci.


 startare il progetto ed iniziare a lavorarci.
Il progetto è partito: ho mostrato ai miei colleghi il risultato di ore di
sonno perse nel weekend ed è piaciuto.
In passato avevo iniziato alcuni progetti openSource dal mio sito
(
javalab.it
) ed ero soddisfatto della risposta che ottenevo. Un giorno ho
scoperto che qualcuno aveva scambiato il concetto di openSource come
'schiavismo gratuito' e ci marciava su e ci guadagnava e quindi ho mollato
tutto. Se vuoi startiamo pure qualcosa (appena finisco quello che sto
facendo comunque te lo invio visto che tu sei il vero proprietario del
cuore) ma non in openSource.. al massimo preferisco freeware senza sorgenti
del sistema... ma soltanto del pushing system come hai gia fatto.
Se serve dello spazio io ne ho molto sul mio server (ho ancora 400 mega
liberi) e di banda (mi rimangono circa 15 giga al mese non utilizzati) già
tutto pagato fino alla fine dell'anno.
Ok... buona giornata.



Spettacolo! Okay, vediamo se riesco a ritagliarmi del tempo prossimamente!
Ah, sei per caso di Torino? Qui stiamo startando un JUG.


 Ciao,
No: son di Novara.. e qui è ancora troppo presto per parlar di JUG visto che
siam in pochissimi a programmar in Java (che io conosco) se non qualche
smanettone.
(se sei di Novara e stai leggendo questo post e non sei uno smanettone e non
ci conosciamo scusami... ma mandami una email così iniziamo a contarci :| )
--


No: son di Novara...
Beh, ma sei vicino! Una scappata ogni tanto puoi farla, no? :-)


 contarci :| ) 
cioa, io sono di Trecate, praticamente di Novara :) per chi non lo sapesse,
Mi scuso con Bruno se sono sparito ma ho avuto un sacco da fare in questi 
giorni...settimane...
Anche a me interesserebbe partecipare a questo progetto anche se ho 
veramente pochissimo tempo a disposizione, come tutti d'altronde mi pare di 
aver capito...
   bEPpE