Guybrush Threepwood Geschrieben 22. April 2009 Geschrieben 22. April 2009 Ich weiß nicht ob ich gerade auf dem Schlauch stehe aber angenommen ich will eine Applikation schreiben mit der 2 Benutzer miteinander chatten können und stelle dazu eine Socketverbindung her und lege eine NetworkStream Instanz damit an. Jetzt kann ich darüber ja einfach Daten hin und her schicken, aber woher weiß ich auf der einen Seite das die andere jetzt Daten gesendet hat die ich lesen muss? Es gibt ja kein Event oder so dafür. Wann man senden muss ist ja klar, sobald der Benutzer etwas eingegeben hat aber fürs empfangen fällt mir nur die DataAvailable Property des NetworkStreams auf, welche aber ja bedeuten würde das man ständig in einer Schleife darauf abfragen müsste und das würde (im besten Fall nur) das Senden blockieren. Ich bezweifle mal einfach das man aus 2 verschiedenen Threads gleichzeitig schreiben und lesen kann. Jeweils eine Socketverbindung zum Lesen und Schreiben finde ich auch nicht ansprechend. Die einzige Möglichkeit die mir noch einfallen würde wäre das immer abwechselnd etwas geschickt wird bzw. wenn gerade nichts eingegeben wurde ein leerer Buffer gesendet wird (oder etwas das verworfen wird) aber das produziert ja unnötig Verkehr... Zitieren
VaNaTiC Geschrieben 23. April 2009 Geschrieben 23. April 2009 Ohne erstmal konkret auf NetworkStream einzugehen unterscheidet man bei Socket-Programmierung prinzipiell blockierende und "non-blocking", das erreicht man z.Bsp. über die SO_LINGER und die diversen Kapselungen in den Socket-API's. Man spricht auch von synchroner und asynchroner Socket-Programmierung. Semaphoren sind dann komplett ereignisgesteuert und nicht blockierend. Fakt ist blockierende sockets warten IMMER auf das Feedback des Gegenübers. Ob das ein Connect oder ein Read ist, spielt keine Rolle. Ergo wird das im Client oft ganz normal programmiert und im Server mit einem Thread pro Client. Da Du eine bidirektionale Lösung gewählt hast, bedeutet dass das beide Partner jeweils spontan senden könnten, egal wer nun als Socket-Server und Socket-Client fungiert. Wichtig ist demnach nur, dass beide in einer Schleife DataAvailable abfragen müssen. Zitieren
DominikJ Geschrieben 23. April 2009 Geschrieben 23. April 2009 Hey, also ich nutze da für meinen UDP-Listener sowas: Dim sEndpoint As New IPEndPoint(IPAddress.Loopback, 0) Dim state As New StateObject cSocket.BeginReceiveFrom(state.Buffer, 0, state.BufferSize, SocketFlags.None, sEndpoint, New AsyncCallback(AddressOf onDataReceivedC), state) Ist nun VB.Net Ich weiß nicht ob du das evtl. auf dein Prob übertragen kannst. Zitieren
Klotzkopp Geschrieben 23. April 2009 Geschrieben 23. April 2009 NetworkStream.BeginRead Method (System.Net.Sockets) Zitieren
Guybrush Threepwood Geschrieben 23. April 2009 Autor Geschrieben 23. April 2009 Wichtig ist demnach nur, dass beide in einer Schleife DataAvailable abfragen müssen. NetworkStream.BeginRead Method (System.Net.Sockets) Also geht das doch was ich oben geschrieben habe? Ich bezweifle mal einfach das man aus 2 verschiedenen Threads gleichzeitig schreiben und lesen kann. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.