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

    Client -Server chiusura socket dopo invio file

    Devo inviare un file da Server al Client, utilizzo FileInputStream per leggere i dati del file e OutputStream associato alla socket del client per inviare i dati.

    codice:
    FileInputStream f = new FileInputSteam(C:\\file.txt);
    OutputStream o = sock_client.getOutputStream();
    
    ………
    
    while((p =f.read(buf))!= -1)
    {
    	o.write(buf,0,p);
    }
    
    f.close();
    o.close();
    Se non chiudo l’OutputStream ho problemi nella lettura del file nel client, il quale rimane bloccato nel ciclo di lettura, forse aspettandosi ancora dei dati.
    Se invece chiudo l’OutputStream succede che la socket associata al client mi viene chiusa anche se non lo faccio esplicitamente, infatti quando nel resto del programma invio un informazione al client viene lanciata un eccezione dicendomi che la socket è stata chiusa.
    A me serve inviare il file e continuare ad interagire con il client per altre cose come posso fare?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Devi creare un "protocollo": ovvero, devi poter inviare al client qualcosa in modo che quest'ultimo riesca ad interpretarlo per capire che l'invio del file è finito.

    Ad esempio, potresti prima di tutto, inviare al client la dimensione del file che andrai successivamente ad inviare. Il client, avendo questa informazione, sa quanti byte aspettarsi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Originariamente inviato da LeleFT
    Devi creare un "protocollo": ovvero, devi poter inviare al client qualcosa in modo che quest'ultimo riesca ad interpretarlo per capire che l'invio del file è finito.

    Ad esempio, potresti prima di tutto, inviare al client la dimensione del file che andrai successivamente ad inviare. Il client, avendo questa informazione, sa quanti byte aspettarsi.


    Ciao.
    Ti ringrazio per la risposta volevo chiederti perchè se chiudo l'outputStream si chiude pure la socket, senza che io lo faccia esplicitamente sia nel client che nel server poiche non c'è in questa parte del codice una istruzione del tipo client_socket.close(), Io dovrei dire al client leggi il file per un totale di DIM byte e poi nel client faccio un ciclo fino a leggere DIM byte ed esco dal ciclo magari con un break, questo significa che l'OutputStream associato alla socket non lo devo chiudere in questo momento ma solo alla fine del programma, anche se creo un OutputSteram per ogni invio di file.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Perchè è esattamente il comportamento descritto nella documentazione del metodo getOutputStream() della classe Socket:

    Closing the returned OutputStream will close the associated socket.
    La chiusura di uno dei due canali (input/output) di una Socket comporta automaticamente la chiusura della Socket.

    Mi pare, oltretutto, che non sia consentito creare più wrapper sullo stesso OutputStream (richiamando il metodo getOutputStream() della Socket, verrà sempre restituito lo stesso oggetto OutputStream). Il metodo getOutputStream() non crea un OutputStream: esso esiste già; il metodo, semplicemente, ne restituisce il riferimento.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    GRAZIE GRAZIE GRAZIE
    Pensavo il problema fosse dovuto ad altro!!!

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.