Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174

    Scrivere un file a pezzi

    Ciao a tutti sto realizzando un'applicazione basata sul protocollo BitTorrent e quando si effettua il dowload dei frammenti (chunk) devo scriverli sul file. Poichè la ricezione non è sequenziale, bensì mi possono arrivare chunk non ordinati, ho il problema di scrivere questi dati sul file di destinazione, che al termine sarà il file che avrei scaricato. Non ho mai avuto a che fare con questo genere di cose e mi è venuta un'idea: siccome quando scarico il descrittore del file (.torrent) ho la dimensione dell'intero file e la dimensione dei chunk è prestabilita (4Kb), avevo pensato di effettuare l'allocazione del file finale con array di byte vuoti, ciascuno della dimensione del chunk e poi, man mano che mi scarico i chunk, sapendo il numero del chunk lo vado a scrivere nella giusta posizione del file, però non ho idea di come fare il "seeking" sul file vuoto, Voi cosa ne pensate? e se secondo voi va bene, come posso risolvere il problema? Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Perfetto, nel frattempo avevo fatto un pò di ricerche e ho capito che dovevo usare la RandomAccessFile. Però ho una domanda ancora: se io posiziono il puntatore in un certo punto, i dati che scrivo vanno a rimpiazzare qll vecchi oppure vengono solo aggiunti? Poi approfondisco con le API

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Mi rispondo da me ho buttato giù un codice di esempio... E tutto torna a mio favore: vengono sovrascritti

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Però una cosa, va bene come idea qll che ho pensato? Pensate sia un buon metodo?

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ci scrive sopra.
    [edit]
    ho visto ora che l'avevi già sperimentato
    [/edit]

    Per quanto riguarda il sistema, fondamentalmente è quello che fanno i vari torrent e quant'altro. Unitamente a qualche controllo sull'integrità del dato trasmesso e sulla posizione in cui andare a scriverlo...in altre parole, si tratta di appiccicare qualche byte in coda e/o in testa al tuo chunk di 4KB contenenti tali informazioni.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Si, si in pratica col descrittore ricavo anche una sequenza di codici sha1 dei singoli chunk e ad ogni download calcolo l'sha1 del chunk e lo confronto con qll del descrittore... Grazie per l'aiuto...

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Mi è sorto un problemino e da qnt ho capito si tratta di una limitazione di Java. Quando devo trasferire un chunk (sempre da 4096 b) invio la richiesta al server, qst legge e mi manda un array di byte della dimensione di 4096, fin qui tutto ok. Qnd il client legge dallo stream associato alla socket legge al più 1024 byte VVoVe: . Ho provato sia con read(byte[]) che con read(byte[], int, int), ma legge sempre e cmq 1024. E' una limitazione? Se si come posso risolvere? Ho pensato a questo punto di impacchettare i chunk (array di byte da 4096) in oggetti e usare send/readObject. Che ne pensate?

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    mmm... mi sembra strano.
    In una vecchia applicazione, usando BufferedInputStream/OutputStream per scaricare file da internet, avevo
    codice:
    BufferedInputStream bis = new BufferedInputStream((new URL("http://filedascaricare")).openStream(), 4096);
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(localfile), 4096);
    byte[] buf=new byte[4096];
    int byteRead;
    while ((byteRead=bis.read(buf,0,4096))>=0) {
      bos.write(buf,0,byteRead);
    }
    bis.close();
    bos.flush();
    bos.close();
    in cui 4096 è del tutto arbitrario.
    Non penso sia molto diverso con RandomAccessFile, con l'accortezza di skippare nel file alla giusta posizione prima di scaricarci l'array.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    174
    Guarda anche a me è sembrato strano, cmq con l'idea che mi era venuta, ovvero qll di mettere l'array in un oggetto funziona, il trasferimento avviene e il file destinazione è integro, forse a livello di socket viene fatto qlk taglio senza che venga notificato come controllo di flusso(???) che magari a livello di filesystem non accade, infatti, tu scrivevi i byte in un file; avevo provato anch'io con la scrittura su file e funzionava, poi con il trasferimento tramite socket ottenevo qll'inconveniente... Mandando gli oggetti probabilmente vengono inviati più segmenti di 1024 senza che ce ne accorgiamo... Boh... cmq l'obbiettivo l'ho raggiunto. Grazie mille

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.