2010-12-20 10 views
1

Ich mache eine Client-Server-App in .NET, aber jetzt habe ich das Problem, dass ich versuche, etwas zu senden, der Client liest es und während des Lesens ich etwas sende Sonst macht es Mist der gesendeten Daten.TCP-Server senden zu schnell in .NET

Beispiel:

  1. I-Test senden
  2. Client startet das Lesen
  3. Ich sende Endtest
  4. -Client liest Test @ $> @ est

Gibt es eine Möglichkeit zu lösen Dies? Jetzt mache ich eine Thread.Sleep(10) nach einem senden, aber ich denke, es gibt einen besseren Weg: P.

P.S. Ich benutze NetworkStream.Write()/Read(), nicht NetworkStream.BeginWrite()/BeginRead(). Welcher von diesen beiden ist besser und warum?

+2

Welche Zeichencodierung verwenden Sie? Können Sie den Code des Servers und des Clients einfügen? – cdhowie

+2

Der Client sollte keine schlechten Daten sehen, nur weil Sie Daten schnell senden. Ich vermute, das Problem liegt nicht am Timing, sondern an etwas anderem in deinem Code. Wir können nicht helfen, ohne * den Code zu sehen. –

+2

Was verwenden Sie zum Senden/Empfangen von Daten in Client-Server. Verwenden Sie Web-Service oder was? und posten Sie einen Code, damit wir Ihr Problem verstehen können. –

Antwort

0

sollten Sie mit WCF mit nettcpbinding für diese Art von Sachen insbesondere wenn beide Enden (Client/Server) in C# sind.

Ich hatte zuvor ähnliche Probleme beim Schreiben von benutzerdefinierten TCP-Code, sondern wechselte zu WCF und es ist deutlich einfacher und stabiler, so können Sie nur auf Ihren Anwendungscode schreiben konzentrieren.

1

Das Problem kann sein, dass Sie den gleichen Socket verwenden, um mehrere "Dinge" von Daten zu senden. Sie wissen vielleicht, dass Sie eine Zeichenfolge und dann ein Bild gesendet haben, aber TCP sieht keine separaten Objekte, sondern nur einen einzelnen Byte-Stream.

Sie können auch nicht wissen, wie viele Leseaufrufe Sie machen müssen, um Ihr "erstes" Datenobjekt zu erhalten. Das Abgrenzen mehrerer Objekte liegt außerhalb des TCP-Bereichs. Der Punkt ist, dieses Problem wird am besten gelöst, indem man ein einziges Socket pro Transaktion verwendet. Erstellen Sie einen Socket, schreiben Sie Ihre gesamten Daten in einen einzigen Schreibaufruf und schließen Sie dann den Socket. Lassen Sie den Kunden lesen, bis Sie die Gesamtheit der Daten haben. Wenn Sie etwas anderes senden müssen, stellen Sie einen neuen Socket her.

Ich weiß, dass dies nicht spezifisch für die NetworkStream-Klasse ist, aber ich hoffe, es hilft.

0

Wenn ich Sie wäre, würde ich beim Senden und Empfangen von Daten eine Regel erstellen. Wie gesagt, Sie haben ein Startzeichen wie $ zum Beispiel und * ist das Endzeichen. Das hilft Ihrem Client/Server-System zu wissen, wann es zu lesen oder wann zu schreiben ist, und schließlich Müll in dem Prozess zu vermeiden. so in Bezug auf die Schritte:

  • Client sendet Nachricht $ Hallo Welt *
  • Server zu lesen beginnt, wenn es die $ sieht und stoppt nach dem *

dann wieder, vielleicht ein Codebeispiel von dem, was Sie tun, könnte uns helfen, genau festzustellen, was Sie falsch machen.