websocket client

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Pixxxas.

    websocket client

    Hallo,
    ich möchte gerne eine verbindung zu einem Game Server herstellen (Rust) und den Status und Spieleranzahl anzeigen lassen.
    Ich weiß das die connection via websocket funktioniert.
    ws://<ip>:<port>/password

    Leider habe ich kein anhaltspunkt wie ich anfangen kann :/

    Würde mich freuen, wenn Ihr mir weiterhelfen könnt.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Ich benutze jetzt die Lib WebSocketSharp (github.com/sta/websocket-sharp)

    Die verbunden baue ich so auf:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. WebsocketClient = New WebSocket("ws://127.0.0.1:28031/1234")
    3. AddHandler WebsocketClient.OnOpen, AddressOf OnOpen
    4. AddHandler WebsocketClient.OnOpen, AddressOf OnClose
    5. AddHandler WebsocketClient.OnOpen, AddressOf OnError
    6. AddHandler WebsocketClient.OnMessage, AddressOf OnMessage
    7. WebsocketClient.Connect()
    8. WebsocketClient.Send("status")
    9. End Sub


    Die Verbindung wird auch aufgebaut und er sendet "status zum Server".

    Was ich nicht versteh, wie kann ich mir ausgeben, was der Server zurück antwortet?
    Wie kann ich einfach überprüfen ob der Server Online oder Offline ist?
    Hi,

    ich denke nach 773 Beiträgen im Forum wirst du sicher deine selbst verlinkte Seite lesen können oder?
    Da wird doch echt super alles beschrieben sogar mit Beispielcode.
    Wo liegt hier also das Problem? Fehlt dir Verständnis die Seite selbst zu lesen und dich einzuarbeiten? Verstehst du den Code nicht?
    Sag uns wo wir helfen können.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Tja dann schau dir mal an in der Sub OnMessage was alles in e drin steckt, kommt ja ein Argument rein mit diesen Namen, es sein denn du hast es anders benannt. Ohne jemals mit dem Ding von Github gearbeitet zu haben, sah ich beim runterscrollen auf der Seite was zu tun ist, wenn du das nach 10+ Jahren nicht kannst, lerne mal richtig mit einem Buch. Schreibe in der sub OnMessage ein e dann einen Punkt, schau dir an was Intellisense dir vorschlägt. Einen Punkt auffer tastatur wirste ja wohl finden....

    Pixxxas schrieb:

    Da kommt leider nichts zurück
    Ist die MessageBox leer
    oder
    wird gar keine MessageBox angezeigt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Möglicherweise wird dann nicht das Event OnMessage gefeuert sondern OnError. Probier mal ob dort ein Fehler reinkommt. Achte aber drauf alles richtig zu abbonieren, in Post #3 hast du da wirre Sachen gemacht, nämlich 3 mal OnOpen mit 3 verschiedenen Subs.
    Leider nichts :/ aber warum wird das Event OnClose gefeuert, wenn ich Connecte?

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. WebsocketClient = New WebSocket("ws://127.0.0.1:28031/1234")
    3. AddHandler WebsocketClient.OnOpen, AddressOf OnOpen
    4. AddHandler WebsocketClient.OnClose, AddressOf OnClose
    5. AddHandler WebsocketClient.OnError, AddressOf OnError
    6. AddHandler WebsocketClient.OnMessage, AddressOf OnMessage
    7. WebsocketClient.Connect()
    8. WebsocketClient.Send("status")
    9. End Sub


    So verbinde ich jetzt, klappt auch alles so weite aber dann ruft er OnClose auf.

    VB.NET-Quellcode

    1. Sub OnClose(sender As Object, e As WebSocketSharp.CloseEventArgs)
    2. MsgBox("Reason : " & e.Reason)
    3. End Sub

    Reason : an exception has occurred while receiving

    PHP-Quellcode

    1. |Fatal|Ext.ReadBytesAsync|System.IO.IOException: Von der Übertragungsverbindung können keine Daten gelesen werden: Eine bestehende Verbindung wurde softwaregesteuert
    2. durch den Hostcomputer abgebrochen. ---> System.Net.Sockets.SocketException: Eine bestehende Verbindung wurde softwaregesteuert
    3. durch den Hostcomputer abgebrochen
    4. bei System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
    5. bei System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
    6. --- Ende der internen Ausnahmestapelüberwachung ---
    7. bei System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
    8. bei WebSocketSharp.Ext.ReadBytesAsync(Stream stream, Int32 length, Action`1 completed, Action`1 error)
    Ich versteh nicht, wie ich mir den Text in eine RichTextBox zurück geben kann :/

    VB.NET-Quellcode

    1. Public Sub OnMessage(sender As Object, e As WebSocketSharp.MessageEventArgs)
    2. 'MsgBox(e.Data.ToString)
    3. Dim text As String = e.Data.ToString
    4. RichTextBox1.AppendText(text)
    5. End Sub


    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement RichTextBox1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
    Ok danke, das geht soweit.

    Das kommt jetzt dabei raus:

    PHP-Quellcode

    1. {
    2. "Message": "hostname: Test Server\nversion : 2325 secure (secure mode enabled, connected to Steam3)\nmap : Procedural Map\nplayers : 0 (2 max) (0 queued) (0 joining)\n\nid name ping connected addr owner violation kicks \r\n",
    3. "Identifier": 1,
    4. "Type": "Generic",
    5. "Stacktrace": ""
    6. }


    Jetzt möchte ich selektieren mit:

    VB.NET-Quellcode

    1. Public Sub OnMessage(sender As Object, e As WebSocketSharp.MessageEventArgs)
    2. Dim packet = JsonConvert.DeserializeObject(Of Sharpcon.WebSockets.Packet)(e.Data)
    3. RichTextBox1.BeginInvoke(Sub() RichTextBox1.AppendText(packet.Message))
    4. 'RichTextBox1.BeginInvoke(Sub() RichTextBox1.AppendText(e.Data))
    5. End Sub



    VB.NET-Quellcode

    1. Imports Newtonsoft.Json
    2. Namespace Sharpcon.WebSockets
    3. Public Class Packet
    4. <JsonProperty("Identifier")>
    5. Public Property Identifier As Integer
    6. <JsonProperty("Message")>
    7. Public Property Message As String
    8. <JsonProperty("Name")>
    9. Public Property Name As String
    10. Public Sub New(ByVal message As String, ByVal identifier As Integer, ByVal Optional name As String = "Rcon")
    11. identifier = identifier
    12. message = message
    13. name = name
    14. End Sub
    15. End Class
    16. End Namespace


    erhalte aber den Fehler:
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Wo/in welcher Zeile kommt für welches Objekt die Meldung? Sowas immer mit angeben. :S
    Ist packet nach dieser Zeile überhaupt etwas, also nicht Nothing? Falls es Nothing ist, wird's in der nächsten Zeile crashen. Dann musst Du schauen, warum es Nothing ist? Ist vielleicht in e.Data nix drin?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Der Fehler wird bei

    VB.NET-Quellcode

    1. RichTextBox1.BeginInvoke(Sub() RichTextBox1.AppendText(packet.Message))
    ausgelöst.

    packet.Message ist Nothing

    zieht er sich nicht die Daten aus e.Data?

    VB.NET-Quellcode

    1. Dim packet = JsonConvert.DeserializeObject(Of Sharpcon.WebSockets.Packet)(e.Data)


    anders Gefrage, nach meiner Abfrage erhalte ich das zurück;

    XML-Quellcode

    1. {
    2. "Message": "237 FPS",
    3. "Identifier": 1,
    4. "Type": "Generic",
    5. "Stacktrace": ""
    6. }


    Wie kann ich die Abfrage machen, dass ich nur "Message": "237 FPS", oder 237 FPS zurück bekomme?

    EDIT: hab es

    VB.NET-Quellcode

    1. fps.BeginInvoke(Sub() fps.Text = JObject.Parse(e.Data)("Message"))

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Pixxxas“ ()