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

    scambio file via socket

    Qualcuno sa come copiare un file da un host remoto? Ci sto sbattendo da giorni. Quando il mio client ftp riceve dall'utente una richiesta di download, sgancia un nuovo thread che si connette al server.

    Questo nuovo thread inoltra la richiesta di get al server, fornendogli il path del file desiderato, una stringa quindi, e poi trasferisce l'output del server su un file omonimo.

    In teoria volevo fare così...

    Ho usato istruzioni come queste ma non va: il file creato localmente è vuoto.

    codice:
    DataInputStream src=new DataInputStream(socket.getInputStream());
    FileOutputStream dst=new FileOutputStream(path);
    PrintWriter p=new PrintWriter(socket.getOutputStream(),true);
    
    p.println("get%"+path+"%");
    
    // alternativa
    // while(src.available()!=0) dst.write(src.read());
    
    byte b[]=new byte[1024];
    int len;
    while((len=src.read(b))>0) dst.write(b,0,len);
    le istruzioni sul server sono simmetriche.

    codice:
    FileInputStream src=new FileInputStream(path);
    DataOutputStream dst=new DataOutputStream(socket.getInputStream());
    
    // alternativa
    // while(src.available()!=0) dst.write(src.read());
    
    byte b[]=new byte[1024];
    int len;
    while((len=src.read(b))>0) dst.write(b,0,len);

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non mi sbilancio in altre considerazioni, ma quel che di sicuro manca (ed è fondamentale nella scrittura) è il flushing e il closing degli output stream.
    quindi intanto aggiungi dst.flush e dst.close e poi vediamo (magari un po' più di codice) che altro potrebbe essere da sistemare.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Ti ringrazio. Non ricordo più cosa non andasse, stamattina di buon ora smanettendo è partito subito (un colpo di fortuna insomma).
    I comandi finali sono src.close(); dst.close(); socket.close(); forse banalmente avevo invertito input e output. Il flush non l'ho messo ma non mi sta dando problemi.

    Un bug di cui mi son ora accorto è che se il file su uno dei due host non esiste, sull'altro viene comunque creato. Se stampo len mi scrive 53 e si ferma. Tuttavia il file rimane aperto, infatti non riesco a cancellarlo finché non fermo il programma.

    Non posso inviare un messaggio d'errore quando ad esempio sul server si solleva una FileNotFoundException perché la stringa verrebbe considerata un pezzo del file.

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Ti basta creare un socket per i messaggi e l'altro per i trasferimenti. flush è necessario: senza non hai garanzia che il buffer di scrittura sia effettivamente svuotato del tutto... potresti trovarti in situazioni in cui il file viene creato, ma le dimensioni, seppure non 0, siano diverse. Flush obbliga lo stream a svuotarsi per cui tanto viene letto e tanto viene scritto, sempre e comunque.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Ti basta creare un socket per i messaggi e l'altro per i trasferimenti
    Usando questa politica, di dire al server quale socket contattare per i messaggi, non può teoricamente accadere che un thread "malizioso" indichi il socket di qualcun altro rifilandogli tanti messaggi spazzatura?

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

  7. #7
    Originariamente inviato da Andrea1979
    E come?
    Se il client indovina la porta e l'host di un altro e lancia un loop infinito di get file, a quel client non arriva per n volte quel file o n messaggi d'errore tanto da non vedere nient'altro?

    Ad ogni modo anche volendo come dovrei fare? Al nuovo thread passo il socket; lui lo invia come stringa /127.0.0.1:1200 al server; il server usa il costruttore Socket(String host, int port)?

    Il client come fa ad accettare la richiesta di connessione senza avere esso stesso un ServerSocket? Altrimenti dovrei avere sul server un buffer di socket già aperti e se per esempio c'è /127.0.0.1:1200 lo prendo e faccio su di esso un write giusto?

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Hai lo stesso problema con qualsiasi numero di Socket, Thread e quant'altro: benvenuto nel mondo dei packet sniffers e spoofing. Soluzione, bhè niente a meno di implementare connessioni sicure (tunnel SSL). Dipende da dove andrai ad utilizzare questa applicazione.

    Si fa alla stessa maniera in cui hai fatto per il trasferimento di file.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Il mio dubbio è sull'istruzione len=src.read(b). Il file può anche non esistere sul client, ma il server perché dovrebbe rimanere in attesa in eterno dei dati?
    Il discorso vale a prescindere dei messaggi d'errore. Un client maligno può benissimo non avvertire il server di proposito e viceversa. Dovrebbe essere buona norma chiudere la connessione automaticamente se len non si aggiorna più. Provo a vedere se il metodo setSoTimeout serve proprio a questo.

  10. #10
    Funziona, oh yeah.. solito colpo di fortuna.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.