Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327

    [JAVA] byte length su getInputStream()

    Salve,
    ho messo su un sistema client/server che comunica attraverso socket... per leggere gli stream di byte utilizzo getInputStream, faccio una cosa di questa per ottenere i byte che mi sono stati inviati dal server

    byte[] buf = new byte[10];

    s1.getInputStream().read(buf, 0, buf.length);

    adesso viene la domanda, è possibile conoscere la lunghezza di byte che mi vengono passati da uno stream??

    cioè invece di crearmi una variabile byte e specificare la dimensione dell'array, posso fare in modo di prendere l'intero stream senza specificarne la dimensione??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    La dimensione dell'array che viene specificata è solo relativa al "singolo pacchetto" di dati che viene letto, non ha nulla a che vedere con la dimensione dei dati inviati.

    La dimensione effettiva dei dati letti viene restituita dal metodo read() (vedi la documentazione di InputStream) e può essere anche inferiore al numero di byte che l'array può contenere.

    Generalmente, comunque, la dimensione del buffer viene data come multiplo di 1024.

    La classe InputStream mette anche a disposizione il metodo available(), che restituisce il numero di byte che possono essere letti prima che la prossima istruzione read() si blocchi. Questo valore indica, in buona sostanza, il numero di byte attualmente presenti nello stream. Questo valore, chiaramente, non corrisponde sempre al numero di byte che il client ha inviato: il client potrebbe inviarne altri in un momento successivo o altri byte potrebbero essere in attesa di un flush().

    C'è anche da dire che non è quello il modo più corretto per leggere i dati dall'InputStream della Socket, a meno che tu non sia sicuro che in quei 10 byte ci sia tutta la comunicazione possibile. Generalmente si effettua un ciclo di letture finchè non avviene qualcosa (il client si disconnette, si riceve un byte o una sequenza di byte che caratterizza la fine della comunicazione, altro...).

    Fai una ricerca nel forum: è un argomento che è stato trattato spesso, anche ultimamente.


    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
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    grazie mille adesso mi è più chiaro...

    secondo te una cosa del genere è corretta?

    codice:
    NumberByte = socket.getInputStream().available();
    			
    byte[] buf = new byte[NumberByte];
    			
    BuffRead = socket.getInputStream().read(buf, 0, buf.length);

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Aggiusti un po' il tiro, ma questo non è il modo più adatto per risolvere la comunicazione via socket

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    Originariamente inviato da valia
    Aggiusti un po' il tiro, ma questo non è il modo più adatto per risolvere la comunicazione via socket
    si lo so, però per comunicare con il server ho l'esigenza di controllare un certo numero di bytes prima di accettare un intero stream.


    @LeleFT
    che vuol dire??
    prima che la prossima istruzione read() si blocchi


    Io inizialmente utilizzavo il BufferReader

    BufferedReader(new InputStreamReader(m_oWorkingSocket.getInputStream( )))

    solo che per altre esigenze ho dovuto abbandonarlo, perchè non posso controllare i byte che mi servono, l'InputStreamReader interpreta l'intero stream

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da hackerdm
    @LeleFT
    che vuol dire??
    prima che la prossima istruzione read() si blocchi
    Esattamente quello che ho scritto (e che è scritto anche nella documentazione):

    Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream
    Cioè ritorna il numero (una stima del numero) di byte che possono essere letti (o skippati, ma non è questo il tuo caso) prima che una ulteriore invocazione di read() (o skip) si blocchi in attesa di dati.

    Cioè, se available() ritorna 10, significa che:

    1) Puoi effettuare una chiamata al metodo read() passando un array di 10 byte e questa istruzione ritorna subito con i byte letti, restituendo il valore 10.

    2) Puoi effettuare 10 chiamate al metodo read() passando un array di 1 byte e queste 10 invocazioni ritorneranno subito, ciascuna con un byte letto dallo stream e ciascuna restituendo il valore 1.

    3) Puoi effettuare una chiamata al metodo read() passando un array di 15 byte. La chiamata tornerà ritornerà subito con l'array riempito nelle prime 10 posizioni, nelle successive avrai il byte 0 e la read() restituisce il numero 10.

    4) Qualunque altra invocazione del metodo read() dopo una delle situazioni precedenti, farà sì che l'esecuzione si blocchi in attesa di ulteriori dati (la read() è bloccante).


    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    per bloccante intende che finchè non riceve dati resta appeso e non prosegue con l'esecuzione del codice??

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    già c'hai ragione, resta appeso se non invoco available();, perchè in quel caso procede... noto però che procede anche se non riceve nulla... a me interesserebbe restare appeso fino alla ricezione dei byte

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    327
    come dicevamo ieri il read rimane appeso, esiste un timeout per il read??

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da hackerdm
    come dicevamo ieri il read rimane appeso, esiste un timeout per il read??
    Devi impostarlo sulla Socket:

    codice:
    Socket s = ...
    s.setSoTimeout( 30000 );
    Questo esempio fa sì che la read() attenda al più 30 secondi per ricevere i dati. Se non riceve nulla entro 30 secondi viene sollevata una eccezione SocketTimeoutException.

    Vedi anche la documentazione che ti ho linkato, soprattutto il metodo setSoTimeout(), che dice

    The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0. A timeout of zero is interpreted as an infinite timeout.

    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

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.