VB.Net asynchrone Clientssockets
Hallo,
ich möchte mir einen WebSocket-Client bauen und habe dabei folgendes Problem:
Wenn die Verbindung zum Server aufgebaut wurde rufe ich die Sub ReceiveSingle auf.
Diese wartet mit BeginReceive auf eine eingehende Nachricht (z.B. Ping) vom Server, empfängt
die Bytes und gibt sie aus.
Anschließend rufe ich die Sub wieder auf. BeginReceive löst sofort den AsyncCallback auf und es wird
1 Byte =0 gelesen und zurückgegeben.
Durch die schleife geht es dann endlos mit 1 Byte lesen weiter ... bis der Server oder Client die Verbindung
trennt.
Was kann ich tun damit BeginReceive bei weiteren Aufrufen wieder auf eine "echte, gefüllte" Nachricht wartet?
Bei Websockets kann ich die Verbinung auch schlecht nach dem Empfang unterbrechen
ich möchte mir einen WebSocket-Client bauen und habe dabei folgendes Problem:
Wenn die Verbindung zum Server aufgebaut wurde rufe ich die Sub ReceiveSingle auf.
Diese wartet mit BeginReceive auf eine eingehende Nachricht (z.B. Ping) vom Server, empfängt
die Bytes und gibt sie aus.
Anschließend rufe ich die Sub wieder auf. BeginReceive löst sofort den AsyncCallback auf und es wird
1 Byte =0 gelesen und zurückgegeben.
Durch die schleife geht es dann endlos mit 1 Byte lesen weiter ... bis der Server oder Client die Verbindung
trennt.
Was kann ich tun damit BeginReceive bei weiteren Aufrufen wieder auf eine "echte, gefüllte" Nachricht wartet?
Bei Websockets kann ich die Verbinung auch schlecht nach dem Empfang unterbrechen
Sub ConnectToEndpoint ()
... Verbindung zu Remote Endpoint ...
... Verbindung aufgebaut ...
Do
Dim B() as byte = ReceiveSingle(SOC)
Console.writeline (getstring(b))
Loop
End Sub
Function ReceiveSingle (socket) as Byte()
Dim bytes(1024) As Byte
If Socket.Connected = False Then Return Nothing
Dim Received As New Threading.AutoResetEvent(False)
Try
Socket.BeginReceive(bytes, 0, 0, SocketFlags.Peek,
New AsyncCallback(
Sub(ac)
Dim i As Integer = Socket.EndReceive(ac)
Socket.Receive(bytes, 0, Socket.Available - 1, SocketFlags.None)
Received.Set()
End Sub
), Nothing)
Catch ex As Exception
Return Nothing
End Try
Received.WaitOne()
Return bytes
end sub
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 369811
Url: https://administrator.de/contentid/369811
Ausgedruckt am: 20.11.2024 um 00:11 Uhr
3 Kommentare
Neuester Kommentar
Hi,
erstmal: "Sub" und "Return" passen nicht zusammen. Vielleicht solltest Du hier den realen Code posten?
Dann:
Der Client wartet auf eine Nachricht vom Server? Sollte es nicht umgedreht sein? Bzw. der Client wartet auf eine Antwort des Servers, nachdem er eine Anfrage gestellt hat?
Ich würde das so lösen, dass ich auch am Client einen Listener starte und dem Server mitteile, dass das so ist und an welchem Port. Dann sendet der Server an diesen Listener und der Client kann reagieren. Der Client fungiert also in diesem Punkt als Server und umgekehrt. Das wäre m.E. auch viel übersichtlicher im Code. Aber vielleicht bin ich da Old School?
Den Server hast Du auch selbst geschrieben?
E.
erstmal: "Sub" und "Return" passen nicht zusammen. Vielleicht solltest Du hier den realen Code posten?
Dann:
Der Client wartet auf eine Nachricht vom Server? Sollte es nicht umgedreht sein? Bzw. der Client wartet auf eine Antwort des Servers, nachdem er eine Anfrage gestellt hat?
Ich würde das so lösen, dass ich auch am Client einen Listener starte und dem Server mitteile, dass das so ist und an welchem Port. Dann sendet der Server an diesen Listener und der Client kann reagieren. Der Client fungiert also in diesem Punkt als Server und umgekehrt. Das wäre m.E. auch viel übersichtlicher im Code. Aber vielleicht bin ich da Old School?
Den Server hast Du auch selbst geschrieben?
E.