mehrfacher WebSocket in einer Anwendung

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von wolfi_bayern.

    mehrfacher WebSocket in einer Anwendung

    Hallo,

    ich arbeite derzeit an einer Anwendung, welche mit verschiedenen Zugangsdaten mehrere Verbindung zu einem WebSocket-Server (gleicher Server) aufbauen soll.
    Der WebSocket ist in einer eigenen Klasse (Class WebSocket). Weiterhin existiert eine Klasse (Class SocketClient), welche den WebSocket instanziert und verschiedene Werte zugänglich machen soll.

    Nun zu meinem Problem: instaziere ich 2 oder mehr Klassen SocketClient, dann nehmen alle Instanzen die Werte der letzten SocketClient an. Ist es irgendwie möglich die Klassen voneinander zu "isolieren"?

    Beispiel:

    VB.NET-Quellcode

    1. Class SocketClient
    2. Public Property irgendwas as String
    3. Sub New()
    4. Dim ws as WebSocket = new WebSocket()
    5. End Sub
    6. End Class
    7. Sub Main()
    8. Dim test1 as SocketClient = new SocketClient(Zugangsdaten1)
    9. Dim test2 as SocketClient = new SocketClient(Zugangsdaten2)
    10. MsgBox(test1.irgendwas) 'gleiche Ausgabe wie test2.irgendwas obwohl ein anderer Wert serverseitig vorliegt
    11. MsgBox(test2.irgendwas)
    12. End Sub


    LG Dietzi
    @dietzi Was sagen denn die Zugangsdaten?

    VB.NET-Quellcode

    1. Dim ws as WebSocket = new WebSocket()
    Was passiert mit ws, wenn die Prozedur verlassen wird?
    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!

    dietzi schrieb:

    Grundsätzlich
    ist in Deinem Code der WebSocket eine lokale Variable, die nach Beenden der Prozedur nicht mehr existent ist.
    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!
    @dietzi OK, dies geht im Gegensatz zu Deinem Code in Post #1.
    Wie wird denn Deine Propperty irgendwas belegt?
    Komm jetzt nicht mit nem halben Satz, sondern mach das mal ein wenig ausführlicher.
    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!
    Post #1 war da mein Fehler. Sorry.
    Property irgendwas spiegelt die Daten wider, welche durch den WebSocket empfangen werden. irgendwas ist vom Typ eine eigene Klasse mit weiteren Propertys. Alle zugänglichen Daten sind aber in den jeweiligen Klassen als Public definiert und nicht mittels Dim in einer Sub bzw. Function.

    Meine Vermutung geht aktuell aber in eine andere Richtung: ich verwende eine fertige Lib für den WebSocket und vermute dass in dieser das Problem liegt. Vermutlich wird dort eine Variable mittels Pointer in einen festen Breich geschrieben und dadurch entsteht der "Fehlzugriff". Ich teste gleich eine andere Lib und schaue ob das Verhalten das gleiche ist. Zumindest könnte ich die fertige Lib als Fehlerquelle dann ausschließen.
    Von welchem WebSocket reden wir hier überhaupt? Die WebSocket-Klasse, die im System.Net.WebsSockets-Namespace liegt ist abstrakt und kann nicht instanziiert werden. Benutzt Du eine externe Library dafür?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @dietzi Kommunizieren beide Sockets mit derselben oder verschiedenen Gegenstellen?
    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!
    Und welche externe .dll ist das? Wäre evtl. hilfreich das zu wissen, damit man das Problem auch nachstellen kann.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    dietzi schrieb:

    allerdings verschiedene Zugangsdaten um verschiedene Daten abzurufen und zu visualisieren.
    Probierma, dafür nur einen Socket zu verwenden und die Parameter vor einer Abfrage zu setzen.
    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!
    Das geht leider nicht. Der Server erwartet initial einen Emmit mit den Zugangsdaten und übermittelt dann in Echtzeit die Daten. Somit müsste ich auf dem Socket permanent die Zugangsdaten ändern was gegen eine Nutzung von WebSocket spricht.

    Ich nutze den WebSocket um Meldungen vom Server zu empfangen und zu verarbeiten.
    @dietzi Aha. Der zweite Socket initialisiert also final die Gegenstelle und überschrfeibt die Initialisierung des ersten.
    Dann musst Du für jede Kommunikation einen neuen Socket erstellen.
    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!

    dietzi schrieb:

    Das ist schon klar.
    Wenn das klar ist, warum isses denn dann so?
    Machst Du

    VB.NET-Quellcode

    1. Class SocketClient
    2. Inherits IDisposable
    3. ' ...
    4. End Class
    im Dispose() räumst Du den WebSocket auf.
    Und dann einfach so:

    VB.NET-Quellcode

    1. Using test1 as SocketClient = new SocketClient(Zugangsdaten1)
    2. ' was tun
    3. End Using
    4. Using test2 as SocketClient = new SocketClient(Zugangsdaten2)
    5. ' was tun
    6. End Using
    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!
    Warum es so ist weiß ich nicht. Das ist ja mein Problem.....

    Dispose macht keinen Sinn, da die WebSockets gleichzeitig laufen sollen. Das heißt es wird kein WebSocket verworfen bevor der nächste aufgebaut wird. Die WebSockets werden mittels Threading fast zeitgleich erstellt
    Also, ich habs versucht nachzustellen. Solange Du 2 Instanzen der Socket-Klasse erstellst, kommen die sich nicht in de Quere.



    Wenn Du magst, kannst Du mehr von dem kompletten Code zeigen, evtl. findet man den Fehler....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Bin jetzt ein Stück weiter...... Ich habe zuum debuggen VIELE Labels hinzugefügt um den Verbindungsstatus und die Daten zu überwachen. Die einzelnen Sockets bauen richtigerweise die Verbindung zur Gegenseite auf. Der "init" vom Server kommt bei allen an. Danach kommen aber die Daten vom Server nur noch beim zuerst initialiserten Socket an. Und jetzt ganz kurios: alle ca 30 Sekunden bekomme ich ein transport-error vom Socket auf jedem Socket. Anschließend läuft der reconnect und das ganze beginnt von vorn. Scheinbar haut da mit der Verbindung irgendwas nicht hin......