Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37

    Servlet sincronizzare output

    ragazzi/e ho un problema con una servlet:

    la mia servlet deve caricare delle immagini e scriverle in output su di un ServletOutputStream.
    l'output sarà poi preso da un'applicazione client java.

    come posso fare in modo che la servlet scriva un'immagine, dopo di che ATTENDE che l'applicazione client java abbia letto i dati e prosegue con la scrittura successiva???

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    è il problema del publisher/subscriver: un unico canale, se non ha letto non puoi andare a scrivere.
    Il problema è che qui non è semplicissimo bloccare il canale.
    Allora penserei (così su due piedi) di fare una cosa:

    1. richiesta scrittura servlet, completata con l'invio al client
    2. client riceve roba, termina con richiesta nuova scrittura

    e via dicendo.
    Porre in attesa il servlet significa porre un blocco di non si sa quanto tempo su una risorsa remota (può non arrivarti ack, il client può bloccarsi e restare appeso all'infinito), quindi una nuova richiesta mi sembra una gestione leggermente migliore (anche se hai un leggero spreco di banda, ma puoi supporre che l'ack si anche la nuova richiesta).

    In questo modo semplifichi anche il codice perché hai una sola cosa da gestire per ogni richiesta, non devi porre niente in attesa.
    Ricorda però che la servlet non si mette in attesa, semplicemente termina.
    Nell'ottica dell'uso di questo meccanismo cerca anche di ottimizzare le operazioni di inizializzazione della servlet (in modo da risparmiare tempo)

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    scusa ma non sò se ho capito correttamente:
    io faccio la mia connessione con il client verso la servlet usando la http openConnection e attraverso questa unica connessione posso inviare più dati mantendo un sincronismo???

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    no, fai una richiesta e al completamento della stessa fai eventualmente la seconda richiesta. Il server invia una sola risorsa per volta (per comodità).
    Fai il codice del server come se dovessi fare un'operazione per volta, il doverla ripetere per un'altro file comporta solo una nuova richiesta client (senza porre in attesa il server).
    Il client fa una richiesta, la completa. Avrà modo per capire se deve ricevere o no ancora robe. Se deve riceverne generi una nuova richiesta.
    Spesso si inviano messaggi di conferma (una nuova richiesta che non chiede risposta) e puoi usare invece questi in caso di nuova richiesta.
    Il punto è non mettere mai il server in attesa di eventi client

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    scusa la mia testardaggine ma con richiesta intendi connessione http???

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Non è detto. Di connessione http puoi usare quella che hai. Non è detto che devi crearne/istanziarne un'altra.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    andiamo più sullo specifico:

    SERVLET:
    ServletOutputStream out2 = response.getOutputStream();
    String pathImage;
    RenderedImage img;

    img=null;
    pathImage = servletPath+"/images/"+request.getSession()+"mappaTagliata_1.gif";
    while(img == null)
    img = ImageIO.read(new File(pathImage));
    ImageIO.write(img, "GIF", out2);

    out2.flush();

    CLIENT:

    servletPath = this.getServletContext().getRealPath(getServletInf o());
    url = new URL("http://83.211.114.229:8080/test/ProvaGoogleMaps?latitudine=41.893554&longitudine=1 2.480469&zoom=10");
    urlConnection = url.openConnection();

    outputFile = new File("nome immaginie");
    img=null;

    img = ImageIO.read(urlConnection.getInputStream());
    if(img!=null)
    ImageIO.write(img, "GIF", outputFile);
    else
    System.out.println("non ho letto alcuna immagine");

    questo è quello che faccio quando devo passare una sola immagine, come posso modificarlo per passare più immagini???

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    lo stesso codice dentro un ciclo che si ripete n volte (n numero di immagini da passare)

    usa i tag code per il codice

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    ma il problema sta proprio li, quando faccio il ciclo while( per n volte) dove n è il numero di immagini, il mio server scrive ma il client dopo aver letto la prima immagine, tutte le volte che rifà altre ImageIO.read riceve da queste NULL. e pertanto il mio programma degenera. :-) soluzione???

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    allora devi fare una serie di funzioni che completi il giro

    1. apri connessione
    2. ricevi file
    3. chiudi connessione

    questo lo metti dentro un ciclo

    ci sono dei valori spuri che non gestisci

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.