Oppure

Loading
17/10/14 15:48
TheDarkJuster
Sto scrivendo un web server per netduino, una scheda simile ad arduino che si programma in C# e che fa target a una versione ristretta del .NET framework. Fino a qui nessun problema: funziona bene, il debug è gradevole visual studio 2013 fa il suo dovere ecc..... Quindi ho preso un esempio di un web server minimale e lo ho cambiato fino a farlo diventare un web server che possa rispondere con delle pagine HTML o script chunked: ovvero mando il contenuto "a pezzi" senza specificare la dimensione, perchè se caricassi una pagina nella ram finirei subito i circa 100KB di RAM. Finchè i file da invieare sono testi posso usare questa tecnica, quando sono pdf/immagini ecc.... devo specificare la lungheza ed inviare i byte al browser. Il problema è con i file binari. Non riesco a leggerli, nè con FileStream nè con StreamReader. Il problema è che la scheda legge i primi caratteri correttamente, ma quelli successivi sono tutti caratteri strani, non visualizzabili che dovrebbero essere altro. Il progetto lo potete trovare qui: code.google.com/p/httpnetduino/ e la parte incriminata è quella nel file BinaryFile (il metodo ReadBlock). Ho debuggato ore, ore, ore, ore, giorni e giorni, ma non c'è stato verso di far leggere tutto il file correttamente, e non so più cosa fare. Chiedo aiuto qui, visto che sul forum ufficiale non mi pubblicano la domanda. Ci tengo a precisare che scegliere questo forum come seconda opzione è dato dal semplice fatto che non credo qui qualcuno possegga un netduino con cui fare il debug, ma spero che possiate illuminarmi ugualmente.

P.S. riporto per i pigroni il sorgente (no, scherzo lo riporto perchè potrebbe tornare utile in futuro sapere come era il sorgente con il problema)

using System;
using System.IO;
using System.Text;
using Microsoft.SPOT;

namespace HTTPDuino
{
    public class HTTPBinaryFile : IDisposable
    {
        private string filePath;
        private System.IO.StreamReader fileBytes;
        private int currentPosition;

        public HTTPBinaryFile(string path)
        {
            //check the file existance
            if (!System.IO.File.Exists(path))
                throw new Exception("The file " + path + " doesn't exists");

            //store the file path
            this.filePath = path;

            //initialize the reader
            this.currentPosition = 0;
            //this.fileBytes = System.IO.File.OpenWrite(this.filePath);
            this.fileBytes = new StreamReader(this.filePath);
        }

        public long getLength()
        {
            return this.fileBytes.BaseStream.Length;
        }

        public string getBlock(ref int read)
        {
            //empty the byte container that will be filled by a portion of file
            char[] buffer = new char[255];

            MemoryStream memory = new MemoryStream();

            read = 0;
            while ((read < 255) && ((this.currentPosition + read) < this.fileBytes.BaseStream.Length)/*this.fileBytes.EndOfStream*/)
            {
                buffer[read] = (char)this.fileBytes.Read();
                //memory.Write(buffer, 0, buffer.Length);
                read++;
            }

            memory.Close();/*
            bytes = memory.ToArray();

            char[] mychars = Encoding.UTF8.GetChars(bytes);
            */
            string dbg = new string(buffer);
            Debug.Print(dbg);

            return dbg;
        }

        public bool endOfBlocks()
        {
            return (this.fileBytes.BaseStream.Length == this.currentPosition);
        }

        #region IDisposable Members
        ~HTTPBinaryFile()
        {
            Dispose();
        }

        public void Dispose()
        {
            //delete every file-related objects
            this.fileBytes.Close();
            this.fileBytes.Dispose();
            this.filePath = string.Empty;
            this.filePath = null;
        }
        #endregion
    }
}


Personalmente ho scelto netduino perchè sto costruendo un phmetro che possa essere consultato come una pagina web e che invii le letture (di ph e di temperatura, lasciamo stare il perchè della temmperatura) come json in maniera asincrona, quindi con del buon css posso fare bella la pagina senza immagini, ma visto che è un progetto che scrivo io per necessità ma che pubblico perchè altri (con altre necessità;) ne possano usufruire mi piacerebbe che funzionasse anche l'invio di file binari
Ultima modifica effettuata da TheDarkJuster 17/10/14 16:07
aaa