Laden...

Asynchrone Socket TCP Abfrage, hat jemand eine vernünftige Lösung?

Erstellt von epidemic vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.413 Views
E
epidemic Themenstarter:in
100 Beiträge seit 2006
vor 14 Jahren
Asynchrone Socket TCP Abfrage, hat jemand eine vernünftige Lösung?

Hallo Zusammen,

ich versuche vom Socket Server den Datenstrom sauber abzufangen.
Dazu habe ich mir folgenden Code gebastelt(Ausschnitt)


 //TCP client erstellen 
                TcpClient client = new TcpClient( server, port );

                // übersetzen des string stromes in bytes
                Byte[ ] data = System.Text.Encoding.ASCII.GetBytes( message );

                // client stream zum lesen und schreiben
                NetworkStream stream = client.GetStream( );

                // schicke data 
                stream.Write( data, 0, data.Length );

                //hier nur als quick Lösung
                // normalerweise im Separaten Thread oder asynchron
                Thread.Sleep ( 400 );

                
                // response byte länge sollte angepaßt werden!
                data = new Byte[ 1024 ];

                // respone string
                String responseData = String.Empty;

                // liest die bytes von soc server
                Int32 bytes = stream.Read( data, 0, data.Length );

               
                
                responseData = System.Text.Encoding.ASCII.GetString( data, 0, bytes );

Das Ding läuft synchron und EMPFÄNGT LEIDER NICHT den kompletten Datenstrom..

Mir fehlt auf dem Socket Client ein erheblicher Teil!

Hat jemand ein vernünftiges Beispiel wo man Daten vom Socket Server, asynchron und vor allem KOMPLETT empfangen kann.

Finde im Netz nur dürftige Erklärungen.
Danke.

S
72 Beiträge seit 2006
vor 14 Jahren

Was heißt empfängt nicht den kompletten Datenstrom? Daten werden immerkomplett bei TCP empfangen, weil TCP ein sicheres Übertragungsprotokoll ist.

Zum Thema synchrone und asynchrone Bearbeitung, siehe

http://www.codeplanet.eu/tutorials/csharp/4-tcp-ip-socket-programmierung-in-csharp.html

“Ene mene mu und raus bist Du!”

M
1.439 Beiträge seit 2005
vor 14 Jahren

Du ließt ja auch nur max. 1024 Bytes ein. Wie willst du denn da alles empfangen, wenn der Client mehr als die 1024 Bytes sendet? 😁

E
epidemic Themenstarter:in
100 Beiträge seit 2006
vor 14 Jahren

Nicht ganz, ich habe auch mit größerem Buffer versucht, das gleiche Ergebnis

@Stefan:
anscheinend doch nicht, ein Thread.Sleep ist notwendig um die Daten zu kriegen.
Ich gehe davon aus
dass NetworkStream.BeginRead-Methode (System.Net.Sockets) / EndRead der Schlüssel zum Erfog ist.
Komme aber irgendwie nicht dahinter wie man es einsetzt..

S
72 Beiträge seit 2006
vor 14 Jahren

@Stefan:
anscheinend doch nicht,

Doch, doch.

ein Thread.Sleep ist notwendig um die Daten zu kriegen.

Nein. Du hast leider nur den TcpClient gelistet, aber das reicht aus um zu sehen was du falsch machst. Du versuchst mit dem NetworkStream zu schreiben und zu lesen, ohne TCP verstanden zu haben.

Die Daten werden nicht unmittelbar an die Gegenstelle versendet. Deine Gegenseite muss kontinuierlich in einer Schleife den TCP-Buffer auslesen, um an alle Daten zu gelangen. Der Empfänger muss wissen, welche Daten und wieviele Daten er empfangen wird. Du versuchst das Problem banal damit zu lösen, indem du Thread.Sleep(400) verwendest und hoffst darauf das Write alle Daten versendet hat und der Server antwortet bevor du mit Read einliest, aber das ist natürlich blanker Unsinn.

Du glaubst offensichtlich, dass das Senden und Empfangen der Daten unmittelbar und ohne Verzögerung vollständig geschieht, das ist natürlich grundlegend falsch.

Ich gehe davon aus
dass NetworkStream.BeginRead-Methode (System.Net.Sockets) / EndRead der Schlüssel zum Erfog ist.
Komme aber irgendwie nicht dahinter wie man es einsetzt..

Nö, das hat mit asynchronen Methoden gar nichts zu tun. Diese dienen lediglich dazu, den laufenden Thread nicht zu blockieren, solange Daten gesendet und empfangen werden.

Ich empfehle dir noch einmal dich dringend mit den Grundlagen auseinander zu setzen.

http://www.codeplanet.eu/tutorials/csharp/4-tcp-ip-socket-programmierung-in-csharp.html

Insbesondere Seite 2, dürfte bei dir für mehr Klarheit sorgen. Hier mal ein Teilsatz.

Paketsegmentierung

Ein einzelner Aufruf zum Senden von Daten über Send kann auch von der Gegenstelle in mehreren Receive-Aufrufen abgearbeitet werden.

[...]

Aus diesem Grunde wird in dem Beispiel kontinuierlich innerhalb einer Schleife die Methode Receive aufgerufen, wobei die Methode solange blockiert bis genügend Daten im TCP-Buffer zur Verfügung stehen um den allokierten Puffer zu füllen.

Dort findest du auch im Anhang komplette Beispiele für synchrone und asynchrone Socketaufrufe mit EndRead etc.

Lesen musst du den Artikel aber schon alleine, da kann dir keiner weiterhelfen.

“Ene mene mu und raus bist Du!”

M
1.439 Beiträge seit 2005
vor 14 Jahren

Nicht ganz, ich habe auch mit größerem Buffer versucht, das gleiche Ergebnis

Was ich dir damit sagen wollte ist: Pack die Read-Methode in eine Schleife und ruf diese solange auf, wie noch Daten vorhanden sind.
Das findest du auch in jedem Tutorial zu Dateien/Sockets

E
epidemic Themenstarter:in
100 Beiträge seit 2006
vor 14 Jahren

Nicht ganz, ich habe auch mit größerem Buffer versucht, das gleiche Ergebnis

Was ich dir damit sagen wollte ist: Pack die Read-Methode in eine Schleife und ruf diese solange auf, wie noch Daten vorhanden sind.
Das findest du auch in jedem Tutorial zu Dateien/Sockets

Zitier mich mich so oft, sonst werde ich rot 😁
Im Ernst:
Ich habe sockets schon vor 10 jahren programmiert...
Grundlagen habe ich durchaus, aber danke für die tipps.

E
epidemic Themenstarter:in
100 Beiträge seit 2006
vor 14 Jahren

Ach so, Stefan:
wenn Du Dich damit so super auskennst, dann poste doch mal ein wernünftiges Beispiel...

S
72 Beiträge seit 2006
vor 14 Jahren

Im Ernst:
Ich habe sockets schon vor 10 jahren programmiert...
Grundlagen habe ich durchaus, aber danke für die tipps.

Warum redest du dann von asynchronen Methoden und versuchst dein Programm krampfhaft mit Thread.Sleep(400) zum Laufen zu bringen, weil du nicht verstehst, warum dein Client ohne Sleep nicht alle Daten empfängt?

Das du schon vor 10 Jahren mit Sockets zu tun hattest, spricht nicht unbedingt für dich oder es ist eine dreiste Lüge. Du verstehst offensichtlich nicht, was TCP ist, geschweige denn, dass du das Protokoll vernünftig mit einem Socket nutzen könntest.

Ach so, Stefan:
wenn Du Dich damit so super auskennst, dann poste doch mal ein wernünftiges Beispiel...

Entweder bist du selten dämlich, oder dir fällt es schwer Hyperlinks anzuklicken. Such dir was aus.

Auf der bereits mehrfach genannten Seite

http://www.codeplanet.eu/tutorials/csharp/4-tcp-ip-socket-programmierung-in-csharp.html

sind Beispiele bis zum Abwinken genannt. Auch hier im Forum finden sich Client-Server-Demos.

Irgendwie kommt man sich hier verarscht vor, wenn man mehrfach Hilfestellung leistet und dann nur blöde Antworten erhält...

“Ene mene mu und raus bist Du!”

E
epidemic Themenstarter:in
100 Beiträge seit 2006
vor 14 Jahren

Gibt es hier einen Moderator, der Dilettanten Beleidigungen entfernt?

Der Junge hat weder Takt noch Verstand, beleidigt Leute und zitiert wie armer Schriftsteller.

Wenn Du anderen nicht helfen willst, dann lass e einfach!!

Hat Jemand von Euch sinvolle Vorschläge, außer solche von ...

S
72 Beiträge seit 2006
vor 14 Jahren

Der Junge hat weder Takt noch Verstand, beleidigt Leute und zitiert wie armer Schriftsteller.

Hat Jemand von Euch sinvolle Vorschläge, außer solche von ...

Unglaublich, was einem für Leute im Netz über den Weg laufen... man kommt sich vor, wie auf der Rütli-Schule.

“Ene mene mu und raus bist Du!”