In quali condizioni un NetworkStream non legge in tutti i dati contemporaneamente?

Nella callback per NetworkStream.BeginRead mi sembra notare che tutti i byte sono sempre letti. Vedo molti tutorial verificare se BytesRead è inferiore ai byte totali e, in caso affermativo, leggere di nuovo, ma questo non sembra mai essere il caso.

La condizione if (bytesRead < totalBytes) non si accende mai, anche se molti dati vengono inviati contemporaneamente (migliaia di caratteri) e anche se la dimensione del buffer è impostata su un valore molto piccolo (16).

  • Come collegamento con le librerie di spinta statica per android?
  • Jabber.net su unità / errore Android (nessun JNI_OnLoad trovato in /system/lib/libc.so, saltando init)
  • Android: consigli di AsyncTask: class privata o class pubblica?
  • Connettere mySQL con Android
  • Popolare un ListView con AsyncTask
  • Verifica se esiste o non esiste URL sul server
  • Non ho provato questo con il modo "vecchio stile" poichè sto usando Task.Factory.FromAsync invece di call NetworkStream.BeginRead e fornendo una callback where chiami EndRead. Forse le attività includono automaticamente questa funzionalità di non restituire fino a quando non vengono letti tutti i dati? Non ne sono sicuro.

    In entrambi i casi, sono ancora curioso di quando non tutti i dati non saranno letti in una sola volta. È persino necessario verificare se non tutti i dati sono stati letti e, in caso affermativo, leggere di nuovo? Non riesco a trovare il condizionale per mai correre.

    Grazie.

  • Imageview e PagerAdapter
  • L'attività di Android ASync ProgressDialog non viene mostrata finché il thread di background non finisce
  • Attivare un proprietario di dispositivi utilizzando NFC in Android Lollipop
  • Lollipop EditBox styling
  • Android: TimerTask programmato per la ripetizione di essere sparati solo una volta
  • Come get i risultati da Map in metodo postExecute di AsyncTask?
  • One Solution collect form web for “In quali condizioni un NetworkStream non legge in tutti i dati contemporaneamente?”

    Provare a submit megabyte di dati su un collegamento lento. Perché il stream desidera attendere finché non fosse tutto lì prima di dare al chiamante qualsiasi cosa? E se l'altro lato non avesse chiuso la connessione, non c'era nessun concetto di "tutti i dati" a quel punto.

    Supponiamo di aprire una connessione ad un altro server e call BeginRead (o Read ) con un buffer di grandi size, ma solo 100 byte, quindi aspetta la tua risposta: cosa ti aspetteresti da NetworkStream ? Non ti dati mai i dati, perché ti sei dato troppo grande un buffer? Sarebbe altamente controproducente.

    Non dovresti assolutamente assumere che qualsiasi stream (con l'exception argomentata di MemoryStream ) riempirà il buffer che lo assegni. È ansible che FileStream sempre disponibile per i file locali, ma mi aspetto che non sia per i file condivisi.

    EDIT: codice di esempio che mostra che il buffer non viene riempito – fare una richiesta HTTP 1.1 (abbastanza male 🙂

     // Please note: this isn't nice code, and it's not meant to be. It's just quick // and dirty to demonstrate the point. using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; class Test { static byte[] buffer; static void Main(string[] arg) { TcpClient client = new TcpClient("www.yoda.arachsys.com", 80); NetworkStream stream = client.GetStream(); string text = "GET / HTTP/1.1\r\nHost: yoda.arachsys.com:80\r\n" + "Content-Length: 0\r\n\r\n"; byte[] bytes = Encoding.ASCII.GetBytes(text); stream.Write(bytes, 0, bytes.Length); stream.Flush(); buffer = new byte[1024 * 1024]; stream.BeginRead(buffer, 0, buffer.Length, ReadCallback, stream); Console.ReadLine(); } static void ReadCallback(IAsyncResult ar) { Stream stream = (Stream) ar.AsyncState; int bytesRead = stream.EndRead(ar); Console.WriteLine(bytesRead); Console.WriteLine("Asynchronous read:"); Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesRead)); string text = "Bad request\r\n"; byte[] bytes = Encoding.ASCII.GetBytes(text); stream.Write(bytes, 0, bytes.Length); stream.Flush(); Console.WriteLine(); Console.WriteLine("Synchronous:"); StreamReader reader = new StreamReader(stream); Console.WriteLine(reader.ReadToEnd()); } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.