Toon posts:

[.NET] SocketStream, veel data

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi Ik heb het volgende probleem:

Ik lees een socketstream uit, echter als nu de hoeveelheid data
groter is dan de Receivebuffersize, dan moet ik blijven uitlezen
(DataAvailable) totdat alle data binnen is. Nu simuleer ik dit door telkens
maar 5 bytes van de stream te lezen. Dit gaat allemaal goed, elke slag
van de repetitie bevindt zich een andere string in de variabele ByteString.
Echter de variabele data, die blijft alleen maar de allereerste waarde die eraan
toegekend is vasthouden, anders gezegd, de overige strings worden niet
geconcateneerd. Nu heb ik wel een idee hoe dat komt, maar geen oplossing.
Als ik in de debugger kijk bij variables, dan zie ik dat de waarde van data
"STRING is en de afsluithaak " die mist, dus is de string niet goed afgesloten volgens mij en kan die daardoor niet concateneren, alleen hoe zou ik dit op moeten lossen|?

Stel ik verstuur de string : "dit is een test"
code:
1
2
3
4
5
6
7
8
9
Dim data As String = ""
     
   While networkStream.DataAvailable()
        Dim bytes(5) As Byte
        networkStream.Read(bytes, 0, 5)
        Dim ByteString As String = ""
        ByteString = Encoding.ASCII.GetString(bytes)
        Data = Data & ByteString
End While

na uitvoering van deze code bevat Data
de waarde "dit i (zonder de afsluithaak ")

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

socketstream.eof?

Iets in die richting :D Ik ben er thuis ook mee aan de slag gegaan, maar ik ben nu niet thuis, dus ik kan het zo niet zeggen :)

edit:
Ik kan met nog iets herinneren met while True, maar dat kan ook voor de listener zijn geweest..

[ Voor 28% gewijzigd door GX op 05-03-2004 10:32 ]


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Probeer s:
Visual Basic .NET:
1
ByteString = Encoding.Unicode.GetString(bytes)

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

C#:
1
2
3
4
5
6
7
8
string data = "";

while(networkStream.DataAvailable())
{
    byte[] buffer = new byte[ 1024 ];
    int bytesRec = networkStream.Read(buffer , 0, buffer.Lenght);
    data += System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRec);
}


Deze bovenstaande code werkt perfect. Heb je trouwens al is met de debugger wat gewatched?

edit:

Is het trouwens niet makkelijker om gewoon socket.Receive te gebruiken? Kun je ook nog is gebruik maken van Asynchroon.

[ Voor 18% gewijzigd door Verwijderd op 05-03-2004 10:44 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je kan ook de Peek() method gebruiken van de Stream, of anders gebruik je gewoon de ReadToEnd method van de StreamReader class.

Zo dus:
code:
1
StreamReader sr = new StreamReader (myNetworkStream);


Nu kan je de streamreader gebruiken om je data uit te lezen, wat heel wat makkelijker gaat.

[ Voor 42% gewijzigd door whoami op 05-03-2004 10:55 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
oké ik heb alle suggesties getest/onderzocht. Hieronder de resultaten

GX: socketstream.eof, dit heeft niks met mijn probleem te maken volgens mij
ik krijg nl wel de string uitgelezen, echter wil ik de data in kleine blokjes van 5 bytes uit de stream halen, alleen als ik die 5 bytes omzet in een string gaat t nog
steeds goed als ik in de debugger kijk, maar zodra ik dan die string wil concateneren dan doet ie dat niet, omdat volgens mij die string niet is afgesloten.
Als ik gewoon in 1 keer alles uitlees gaat het uiteraard wel goed, maar ja als
ik mijn receivebuffersize op 50000 zet, dan is t niet mer vooruit te branden en moet
bestanden van 150 kb kunnen ontvangen, vandaar. en wil het nu in t klein simuleren met stukjes van 5 bytes

Korben: Unicode helpt ook niet het is een ascii string en bytestringneemt de correcte waarde aan.

Cristal: Ik zie eerlijk gezegd geen verschil met mijn code, append jou stirng
wel als je meer dan 1024 bytes stuurt ?

whoami: die streamreader met de readtoend die blockt mijn applicatie.maar moet hier nog een aantal dingen bij onderzoeken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je kan het inlezen natuurlijk op een andere thread laten gebeuren, zodanig dat je UI niet geblocked wordt.

Je kan, ipv die ReadToEnd natuurlijk ook de ReadLine gebruiken.
Hier lees je dan regel per regel in.

[ Voor 34% gewijzigd door whoami op 05-03-2004 19:31 ]

https://fgheysels.github.io/


Verwijderd

Verwijderd schreef op 05 maart 2004 @ 19:25:
Cristal: Ik zie eerlijk gezegd geen verschil met mijn code, append jou stirng
wel als je meer dan 1024 bytes stuurt ?
Deze werkt :9

Nee, ik zou geen clown uithangen. Maar ik convert de string aan der hand van de ontvangen bytes en append ze.
Maar dit werkt gewoon. Maar is sockets niet makkelijker? Omdat je gebruik kan maken van Asynchroon?

Verwijderd

Topicstarter
Oké het werkt nu maar blijf het vaag vinden dat die eerste code niet werkt

code:
1
2
3
4
5
Dim sr As StreamReader = New StreamReader(networkStream)

                While sr.Peek() <> -1
                    data = data & sr.ReadLine() & vbCrLf
                End While


Het is overigens om als SMTP Server data te ontvangen
enhet werkt gelukkig iedereen bedankt.

Verwijderd

SMTP zet toch altijd aan het einde van het pakketje een \n?
Dus readline is dan een goede optie.

Verwijderd

Topicstarter
De code werkt inderdaad zonder enige problemen, alleen vraag ik mij af of er misschien een nettere/ mooiere betere oplossing is, heb 't niet zo op readLine zeg maar. MAar ja als t werkt....

Verwijderd

/me komt op zaterdag avond na bier in met een stukje in kladblock geschreven code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
byte[] buffer = new byte[1024];
NetworkStream stream = tcp.GetStream();
int count = 0;
while(true)
{
    byte[] tempBuffer = new byte[2];
    int bytes = stream.Read(tempBuffer, 0, 1);
    if(bytes == 1)
    {
        buffer[count] = tempBuffer[0];
        count++;

        if(tempBuffer[0] == '\n')
        {
            break;
        }
    }
    else
    {
        break;
    }
}

return enc.GetString(buffer, 0, count);


Meybe heb je hier wat aan? Maar opzich is readline niet verkeerd. Maar ik ben niet zo van het NetWorkStream gedoe. Geef mij maar gewoon Socket.Receive of Socket.BeginReceive en Socket.EndReceive :X

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Cristal, waarom doe jij zo moeilijk door rechtstreeks van de stream te gaan lezen, terwijl je met een StreamReader een veel gemakkelijkere optie hebt.

https://fgheysels.github.io/


Verwijderd

whoami schreef op 07 maart 2004 @ 11:38:
Cristal, waarom doe jij zo moeilijk door rechtstreeks van de stream te gaan lezen, terwijl je met een StreamReader een veel gemakkelijkere optie hebt.
Ik dacht dat BooleanErik eigelijks gebruik wou maken van NetworkStream. Maar zowiezo als ik naar me bovenste source kijk zit ik me af te vragen hoeveel bier ik al op had :X

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Wel, met een streamreader lees je gewoon de NetWorkStream uit. Dan gebruikt hij toch een NetworkStream?

https://fgheysels.github.io/

Pagina: 1