Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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...

Geschrieben

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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...