Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [J2SE] Invio di file tramite socket

    Salve a tutti, ho realizzato un'applicazione client che comunica con un'applicazione server. Tramite un socket sono riuscito a far passare stringhe e array da client a server e viceversa. Quello che non riesco a fare è far passare un intero file (tipo .doc o .pdf o qualunque altro). Spero qualcuno possa aiutarmi, vi ringrazio anticipatamente e buona vita!
    Remigio

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [J2SE] Invio di file tramite socket

    Originariamente inviato da ribisco
    ho realizzato un'applicazione client che comunica con un'applicazione server. Tramite un socket sono riuscito a far passare stringhe e array da client a server e viceversa. Quello che non riesco a fare è far passare un intero file (tipo .doc o .pdf o qualunque altro).
    Dipende tutto da come intendi progettare il "protocollo" di comunicazione da usare tra il tuo client e il tuo server!

    Una cosa semplice e minimale potrebbe essere, per fare un esempio: invio 4 byte che rappresentano un int che contiene la lunghezza del file e di seguito invio N byte del file. E dall'altra parte chiaramente deve essere a conoscenza di questo "protocollo", cioè deve aspettarsi innanzitutto 4 byte per la lunghezza, ottenere un int e "sapere" di dover leggere esattamente N byte.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Scusa, ma non mi è chiara la tua risposta, forse mi sfugge qualcosa. Consideriamo un esempio: supponiamo che io abbia un file pdf sul client e lo devo mandare ad un server in attesa: come posso fare?
    Remigio

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da ribisco
    Scusa, ma non mi è chiara la tua risposta, forse mi sfugge qualcosa. Consideriamo un esempio: supponiamo che io abbia un file pdf sul client e lo devo mandare ad un server in attesa: come posso fare?
    Come ho detto prima .... stabilisci un "protocollo" di comunicazione ... che poi vuol semplicemente dire che devi stabilire che cosa client e server si devono inviare e/o aspettare di volta in volta durante la comunicazione.

    L'esempio più semplice e minimale è quello che ho detto prima. E bisogna precisare che in genere non si invia mai l'intero file con 1 write e letto con 1 read ... lo si fa a blocchi.

    Invio di un file di 1500 byte, supponendo l'invio di blocchi di 1024 byte

    client: invia 4 byte che rappresentano un int per la lunghezza del file
    server: legge 4 byte e deduce la lunghezza del file
    client: legge dal file 1024 byte e li invia al server
    server: legge 1024 byte e li scrive su file
    client: legge dal file 476 byte e li invia al server
    server: legge 476 byte (sa che da 1500, tolti 1024, ne rimangono 476) e li scrive su file
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Eccoti un'implementazione di esempio.
    Ovviamente può essere migliorata, ma è mio scopo essere minimale nell'esportela.

    In questo esempio viene inviato il file sample.txt da un Server al Client

    Codice PHP:
    ///////////////////////  SERVER //////////////////////////////////////////////////
    import java.net.*;
    import java.io.*;

    public class 
    FileServer {
        public static 
    void main (String [] args throws IOException {
           
    // create socket
           
    ServerSocket servsock = new ServerSocket(7777);
           while (
    true) {
              
    System.out.println("Waiting...");

              
    Socket sock servsock.accept();
              
    System.out.println("Accepted connection : " sock);

              
    // sendfile
              
    File myFile = new File ("sample.txt");
              
    byte [] mybytearray = new byte [(int)myFile.length()];
              
    FileInputStream fis = new FileInputStream(myFile);
              
    BufferedInputStream bis = new BufferedInputStream(fis);
              
    bis.read(mybytearray,0,mybytearray.length);
              
    OutputStream os sock.getOutputStream();
              
    System.out.println("Sending...");
              
    os.write(mybytearray,0,mybytearray.length);
              
    os.flush();
              
    sock.close();
           }
        }
    }
    ///////////////////////  CLIENT //////////////////////////////////////////////////
    import java.net.*;
    import java.io.*;

    public class 
    FileClient {
        public static 
    void main (String [] args throws IOException {
           
    int filesize=6022386// filesize temporary hardcoded

           
    long start System.currentTimeMillis();
           
    int bytesRead;
           
    int current 0;
           
    // localhost for testing
           
    Socket sock = new Socket("127.0.0.1"7777);
           
    System.out.println("Connecting...");

           
    // receive file
           
    byte [] mybytearray = new byte [filesize];
           
    InputStream is sock.getInputStream();
           
    FileOutputStream fos = new FileOutputStream("sample-copy.txt");
           
    BufferedOutputStream bos = new BufferedOutputStream(fos);
           
    bytesRead is.read(mybytearray,0,mybytearray.length);
           
    current bytesRead;

     
           do {
              
    bytesRead =
                  
    is.read(mybytearraycurrent, (mybytearray.length-current));
              if(
    bytesRead >= 0current += bytesRead;
           } while(
    bytesRead > -1);

           
    bos.write(mybytearraycurrent);
           
    long end System.currentTimeMillis();
           
    System.out.println(end-start);
           
    bos.close();
           
    sock.close();
        }

    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da matthew80
    Eccoti un'implementazione di esempio.
    Che purtroppo ha poco senso ed è ben poco "realistica". Chi invia il file legge tutto quanto il file in memoria e chi riceve invece presuppone, per i cavoli suoi, la lunghezza del file.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Infatti avevo detto che andava migliorata e che era solo un esempio che gli da cmq la possibilità di partire con qualcosa di concreto
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  8. #8

    Bha.. strano l'avevo già vista

    Originariamente inviato da matthew80
    Infatti avevo detto che andava migliorata e che era solo un esempio che gli da cmq la possibilità di partire con qualcosa di concreto
    Quindi l'hai fatto tu??? Strano mi sembra di averlo già visto da qualche parte..tipo qui.. http://www.rgagnon.com/javadetails/java-0542.html
    Imparare è un'esperienza, tutto il resto è solo informazione. L'imaginazione è la vera conoscenza! (A. Einstein)

  9. #9
    Embè? Il Free software serve a questo! Quando ho un problema la prima cosa che faccio è questa:
    * qualcun'altro ha risolto il problema prima di me? Se si fammi vedere
    * esiste un pattern che affronta questo problema? se si mi informo
    * esiste un algoritmo che risolve il problema? Se si fammi vedere
    * esistono librerie che risolvono il problema? se si fammi vedere
    * qualcuno nel forum ha risolto il problema? se si cerco tra i vecchi form

    altrimenti cerco di risolverlo tutto da solo, ma se il problema non è stato risolto MAI da nessuno...probabilmente sto impostando male il problema!
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

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.