myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Code-Reviews » WebSocket Client Beispiel
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

WebSocket Client Beispiel

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Olii
myCSharp.de-Mitglied

Dabei seit: 20.09.2017
Beiträge: 76


Olii ist offline

WebSocket Client Beispiel

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Leute, ich habe mich mal an Sockets versucht, um genauer zu sein mit WebSockets (System.net.Websockets).

Was ich hier versucht habe darzustellen ist eine Klasse die auf der Klasse WebSocketClient aufbaut. Diese Umsetzung sollte mir helfen damit ich sowohl Syncrone als auch Async Clients erstellen kann.

In meinem Anwendungsbeispiel habe ich die Synchrone Art verwendet da ich davon ausgehe in dem Beispiel das der Socket Server auf meine Nachricht wartet, und mir eine Antwort auf meine Nachricht schickt.

Quasi:
Send: Hallo Server, bitte Arbeite folgende Prozedur ab: <DoStuff>
Receive: Hallo Client, die Aufgabe ist erledigt, du kannst dich jetzt trennen

Ich würde gerne ein paar Rückmeldungen haben ob es Dinge gibt die ich verbessern kann oder ob ich grundlegend etwas falsch gemacht habe.

Ich würde gerne etwas daraus lernen :)

Synchroner Aufruf:

C#-Code:
private async void Initialize()
        {
            CustomSocketClient client = new CustomSocketClient("ws://echo.websocket.org/");

            await client.Start();

            await client.Send("Hallo das ist mein Test");

            string message = await client.Receive();
        }

Und hier die Klasse die ich mir dazu gebaut habe:

C#-Code:
class CustomSocketClient
    {
        private ClientWebSocket client;

        private string _strAdressEndpoint { get; }
        public string _strNotifyMessage { get; set; }

        public CustomSocketClient(string strAdressEndpoint)
        {
            _strAdressEndpoint = strAdressEndpoint;
            Initialize();
        }

        private void Initialize()
        {
            client = new ClientWebSocket();
            _strNotifyMessage = "notify message";
        }

        public async Task Start()
        {
            await OpenConnection();
        }

        private async Task OpenConnection()
        {
            if(client.State != WebSocketState.Open)
            {
                await client.ConnectAsync(new Uri(_strAdressEndpoint), CancellationToken.None); //ToDo built in CancellationToken
            }
        }

        public async Task<string> Receive()
        {
            byte[] buffer = new byte[1024];
            WebSocketReceiveResult result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);//ToDo built in CancellationToken

            if (result.MessageType == WebSocketMessageType.Close)
            {
                return "abort";
            }

            using (MemoryStream stream = new MemoryStream())
            {
                stream.Write(buffer,0, result.Count);
                while(!result.EndOfMessage)
                {
                    result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);//ToDo built in CancellationToken
                    stream.Write(buffer, 0, result.Count);
                }

                stream.Seek(0, SeekOrigin.Begin);
                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                {
                    string message = reader.ReadToEnd();
                    return message;
                }
            }
        }

        public async Task Send(string message)
        {
            if(client.State == WebSocketState.Open)
            {
                byte[] byteContentBuffer = Encoding.UTF8.GetBytes(message);
                await client.SendAsync(new ArraySegment<byte>(byteContentBuffer), WebSocketMessageType.Text, true, CancellationToken.None); //ToDo built in CancellationToken
            }
        }
    }
Neuer Beitrag 05.12.2019 19:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.592
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Generelles Feedback:

In C# hat man noch nie den Typ der Variable in den Namen gesetzt. Man sieht, dass Du vermutlich von C++ kommst.
_strAdressEndpoint -> _adressEndpoint

Halte Dich auch an die C# Namensempfehlungen (zB Async Suffix bei asynchronen Methoden)
public async Task Start() -> public async Task StartAsync()

Nutze asynchrone Methoden
stream.Write(buffer,0, result.Count); >> stream.WriteAsync(buffer,0, result.Count);

Verwende ConfigureAwait(false)
 Use ConfigureAwait

Error Handling über Values oder gar Strings ist ein absolutes No Go

C#-Code:
           if (result.MessageType == WebSocketMessageType.Close)
            {
                return "abort";
            }

Weiterhin dürfte Dein Code in der Form nicht (so einfach) testbar sein, weil Du mit der konkreten Implementierung von ClientWebSocket arbeitest.
Neuer Beitrag 05.12.2019 19:15 Beiträge des Benutzers | zu Buddylist hinzufügen
Olii
myCSharp.de-Mitglied

Dabei seit: 20.09.2017
Beiträge: 76

Themenstarter Thema begonnen von Olii

Olii ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das sind sehr gute Tipps, danke Abt!

Nur eine Frage dazu:

Zitat:
Weiterhin dürfte Dein Code in der Form nicht (so einfach) testbar sein, weil Du mit der konkreten Implementierung von ClientWebSocket arbeitest.

Wie kann ich das verstehen? Dafür gibt es doch den ClientWebSocket oder nich? ^^

Es gibt absolut keine Beispiele im Internet (ich habe Stunden über Stunden nur nach Informationen gesucht, kein Spaß..), weshalb ich dann einfach drauf los gebastelt habe. Auf der MS Seite war als erstes der Client kurz aufgeführt, also hatte ich damit das ganze sofort versucht. War/ist das nicht korrekt?

Irgend eine Idee wo ich was dazu finde? Ein Beispiel oder so? Wie ein WebSocket Server erstellt wird, wird einem an jeder Ecke gezeigt, aber nicht ein kleines Client Beispiel ist zu finden.
Mir fehlt einfach die Idee wie ich es anders machen soll, ich habe gerade absolut keine Vorstellung von einer anderen Sinnvollen umsetzung.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Olii am 05.12.2019 22:19.

Neuer Beitrag 05.12.2019 19:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Olii
myCSharp.de-Mitglied

Dabei seit: 20.09.2017
Beiträge: 76

Themenstarter Thema begonnen von Olii

Olii ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zu implementierungen von Clients mit WebSockets konnte ich bisslang leider nicht finden. Allerdings sind wohl 3 Anbieter Librarys wie WebSocket4NET wohl nicht schlecht. Dann werde ich wohl auf diese zurückgreifen und das ganze mal damit probieren.
Neuer Beitrag 06.12.2019 13:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.592
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

In dem anderen Thema von Dir hab ich Dich bereits mehrfach(?) in Richtung SignalR und GRPC geschubst.
Weiß nicht, wieso Du das ignorierst ;-)
Neuer Beitrag 06.12.2019 13:38 Beiträge des Benutzers | zu Buddylist hinzufügen
Olii
myCSharp.de-Mitglied

Dabei seit: 20.09.2017
Beiträge: 76

Themenstarter Thema begonnen von Olii

Olii ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ganz einfach, weil ich absolut keine Ahnung habe wo ich was einsetzten kann. Ich bin überflutet mit Informationen und Möglichkeiten, das ich momentan absolut garnicht mehr weiß was mein eigentliches Problem ist. Kurzgesagt, ich bin absolut überfordert und stehe unter Zeitdruck.

Überall steht irgendetwas das mich immer wieder vermtuten lässt dass das nicht geeignet ist. Z.B .net core signalR.Client, hier steht in der Überschrift:

Zitat:
The ASP.NET Core SignalR .NET client library lets you communicate with SignalR hubs from .NET apps.

Ich habe weder eine asp.net /core Anwendung sonder nur eine .net core Konsolen Anwendung, noch irgendeine Kontroller über den Server, geschweige denn, was dieser überhaupt verwendet. Die Entwickler dieser Server Anwendung sind bereits in Rente und die Software kann erst Ende nächsten Jahres ersetzt werden. Keine Doku oder sonst was. Niemand weiß was das Teil so genau macht, aber alle brauchen es...
Neuer Beitrag 06.12.2019 14:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.592
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das sind organisatorische Probleme, die auch Software nicht lösen kann.
Solch eine Organisation führt aber oft auch dazu, dass etwas entwickelt wird, was man kurze Zeit später wegwerfen kann.
Neuer Beitrag 06.12.2019 14:57 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 04.04.2020 03:38