Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di godx3
    Registrato dal
    Apr 2008
    Messaggi
    37

    Bytes con InputStream da Socket

    Ciao a tutti,
    ho due processi, un client e un server. Con il client invio un oggetto (con l'ObjectOutputStream) verso il server che deve leggerlo dallo stream. Quando uso l'available (sia in maniera diretta dall'InputStream della Socket, che con l'ObjectInputStream) questo mi ritorna sempre 0, nonostante sia stato inviato un oggetto. Il contenuto c'è e viene tranquillamente leggo con il metodo readObject() dell'ObjectInputStream. Come si spiega? Grazie mille in anticipo

  2. #2
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Il metodo 'available' invocato su un oggetto di tipo InputStream ritorna SEMPRE 0.

    Come le API indicano chiaramente:

    Quote Originariamente inviata da API

    ...
    The available method for class InputStream always returns 0.

    This method should be overridden by subclasses.
    Invocandolo, invece, su un oggetto di tipo EFFETTIVO ObjectInputStream, il metodo 'available' dovrebbe restituire il numero di bytes che possono essere effettivamente letti dallo stream mediante una operazione di read.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    A cosa ti serve chiamare un available() su un ObjectInputStream?

    Solitamente per operazioni di questo tipo (e soprattutto in applicazione client/server) tutto ciò che si fa è attendere un input utilizzando readObject() che è bloccante e ritorna solo quando un oggetto è stato effettivamente letto o quando scade il timeout del Socket.

    E' chiaro che se al momento della prima chiamata ad available() non è ancora stato inviato nulla sul socket (e il client o server che deve ricevere non può sapere con precisione quando i dati gli saranno inviati) il metodo tornerà 0, perchè 0 sono i byte che possono essere letti senza bloccarsi = nessun byte può essere letto senza bloccarsi...


    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

  4. #4
    Utente di HTML.it L'avatar di godx3
    Registrato dal
    Apr 2008
    Messaggi
    37
    Invocandolo, invece, su un oggetto di tipo EFFETTIVO ObjectInputStream, il metodo 'available' dovrebbe restituire il numero di bytes che possono essere effettivamente letti dallo stream mediante una operazione di read.
    Dovrebbe restituire i byte ma non lo fa

    A cosa ti serve chiamare un available() su un ObjectInputStream?
    Vorrei gestire una progress bar...

    E' chiaro che se al momento della prima chiamata ad available() non è ancora stato inviato nulla sul socket (e il client o server che deve ricevere non può sapere con precisione quando i dati gli saranno inviati) il metodo tornerà 0, perchè 0 sono i byte che possono essere letti senza bloccarsi = nessun byte può essere letto senza bloccarsi...
    Ho effettivamente inviato l'oggetto. Infatti se chiamo la readObject mi restituisce l'Object. Ma se chiamo available() prima della readObject() mi restituisce 0 comunque..

  5. #5
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da LeleFT
    A cosa ti serve chiamare un available() su un ObjectInputStream?

    ...
    Probabilmente non erve a nulla ma potrebbe, ad esempio voler sapere la dimensione dell'oggetto inviato.

    La chiamata e' bloccante SOLO nel momento in cui nessun oggetto e' ancora stato inviato sul socket.

    Altrimenti con una readObject() l'oggetto viene immediatamente restituito senza bisogno di nessuna attesa.

    Proprio come accade per gli "stream" di bytes.
    Solamente che in quest'ultimo caso invocare il metodo available serve per indicare nella successiva read quanti bytes andare a leggere in modo che il metodo non vada in attesa/blocco mentre nel caso degli oggetti la lettura dell'oggetto stesso avviene in un "sol colpo" senza che vi sia la necessita', quindi, di sapere i bytes che sono stati inviati sul socket.

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.