C# Dynamischer Buffer aus Stream

eumeldeumel

Newbie
Registriert
Juni 2012
Beiträge
3
Hi Leute,

ich bin neu hier im Forum, und würde mich freuen, wenn ihr meine Frage beantwortet. :)

Also folgendes:
Ich habe mehrere Clients, die Daten an einen Server schicken (TCP). Das klappt alles ganz wunderbar, nur arbeite ich mit einem Buffer, der eine feste Größe hat (128 Bytes). Ich möchte gern, dass sich dieses Byte-Array beim Deklarieren auf die Größe des Streams anpasst.

Das ist meine Klasse, wie sie funktioniert:

Code:
class readStream
    {
        public TcpClient c = null;
        
        public void readSt()
        {
            Stream s = c.GetStream();
            
            while (true)
            {
                try
                {
                    byte[] buff = new byte[128];

                    s.Read(buff, 0, buff.Length);

                    Console.WriteLine(Encoding.ASCII.GetString(buff));
                }
                catch
                {
                    break;
                }
            }
        }
    }

Also ist es quasi möglich, die Länge von 's' in byte[] buff = new byte[128] einzusetzen?

Viele Grüße

Eumeldeumel
 
Eine Möglichkeit wäre:

Code:
var reader = new StreamReader(tcpStream);
string result = reader.ReadToEnd();

var bytes = Encoding.ASCII.GetBytes(result);
 
Vielen Dank für die schnellen Antworten, trotz Fußballspiel! :D

Die erste Variante hat funktioniert.

Die 2. hab ich selbst schon herausgefunden, die will allerdings nicht so recht, keine Ahnung, was da nicht stimmt. ^^

Wie auch immer, hier nochmal die fertige Klasse, hoffe ich hab alles so gemacht, wie ihr's gemeint habt. (es geht so auf jeden Fall :cool_alt:)

Code:
class readStream
    {
        public TcpClient c = null;
        public Thread th = null;
        public TcpListener ls = null;

        public void readSt()
        {
            Stream s = c.GetStream();

            while (true)
            {
                try
                {
                    
                    StreamReader sr = new StreamReader(s);
                    string srInput = sr.ReadLine();
                    byte[] bytes = Encoding.ASCII.GetBytes(srInput);

                    byte[] buff = new byte[bytes.Length];

                    s.Read(buff, 0, buff.Length);

                    string input = Encoding.ASCII.GetString(buff);

                    if (!input.Equals(""))
                    {
                        Console.WriteLine(c.Client.RemoteEndPoint + ": " + input);
                    }
                }
                catch
                {
                    break;
                }
            }

            s.Close();

        }
    }
 
Also eine while(true) Schleife zu bauen, die Beendet wird wenn das Programm einen Fehler wirft ist alles andere elegant. Außerdem legst du als Länge deines "buff" immer die größe der ersten Zeile fest.

Wenn du Zeile für Zeile lesen willst und diese dann ausgeben reicht doch ReadLine und als Bedingung !EndOfStream

Ah ja, okay sorry...
Du kannst natürlich auch Blöcke lesen. Die größe deines Arrays bestimmst du selbst. Read liefert dir ein int zurück in dem es dir Mitteilt wie viel gelesen wurde. Dann kannst du entsprechend in einen String umwandeln.

PS: .Length kannst du nicht benutzen weil es ja ein NetworkStream ist, der die Eigenschaft nicht unterstützt.
 
Zuletzt bearbeitet:
Mir ist klar, dass while (true) nicht schön ist, aber in meinem Konkreten Beispiel ist es praktisch, da mein Programm zum Server connectet, die Daten durchgibt, und das eben immer wieder. So erziehle ich den Effekt, dass wenn beim lesen ein fehler auftritt, er abbricht, und versucht neu zu verbinden.
Ich habe das Progrämmchen grade durchgetestet, und es läuft alles super! :D

Also danke für die gute Hilfe, hat man nicht in jedem Forum ;-)

Gruß

Eumeldeumel
 

Ähnliche Themen

Zurück
Oben