none
Winform Anwendungen sollen sich automatisch verbinden RRS feed

  • Frage

  • Hallo miteinander,

    ich programmiere gerade eine Chat-Anwendung und habe folgendes Problem...

    Die Clients sollen sich automatisch mit dem Server verbinden, ich weis aber nicht wie...

    Ich verlange keine "Fertig-Komplett"-Lösungen sondern vllt. nur ein Code-Schnippel.

    Vielen Dank im Voraus!

    Donnerstag, 13. Mai 2021 17:31

Antworten

Alle Antworten

  • Hi,

    auf welche Weise sollen Client und Server denn kommunizieren? Eigenes Protokoll? http? Was anderes?

    Hast Du generell ein Problem mit dem Verbindungsaufbau oder geht es, wie aus der Fragestellung herauszulesen, nur darum, dass der Client beim Start einmal automatisch die Verbindung aufbaut?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 14. Mai 2021 06:49
    Moderator
  • Servus,

    vielen Dank für ihre schnelle Antwort.

    Ich versuche es via. UDP-Client, also mit Broadcasten.

    Es soll so ablaufen das der Server auf einem Port auf eine Nachricht wartet und wenn er diese erhält nimmt er die IP-Adresse des Client und sendet an diesen ebenfalls eine Nachricht.

    So hat jeder die IP des jeweils anderen...

    (Es sollen mehrere Clients sich logischerweise mit dem Server verbinden können).

    Das Problem ist nur dass die Nachricht bei dem Partner nie ankommt...

    Grüße zurück.

    Freitag, 14. Mai 2021 12:34
  • Hi,
    du solltest erst einmal das logische Spiel festlegen, beschreiben bzw. bei vorhandenem Server ermittelt. D.h., wer sendet wem was? Was wird geantwortet? Wie sieht das Datenformat der "Telegramme" aus?

    Bei einem Chat sendet jeder Client Nachrichten an den Server und erhält vom Serber Nachrichten. Soll das im "Ping-Pong" gemacht werden, d.h. der Client sendet und bekommet als Antwort etwas vom Server zurück? Oder soll Nachrichten vollduplex gesendet und empfangen werden? 

    Sollen die Nachrichten eines Client an alle gesendet werden? Oder soll "adressiert" werden? Kann ein Client beim Server Statusinformation abrufen, wie z.B. Übersicht über alle anderen Clients? Was passiert, wenn ein Client "nicht mehr da" ist, z.B. bei Verbindungsabbruch? Sollen sich Clients beim Server an- und abmelden? Soll es eine Art von "Telefonverzeichnis" auf dem Server geben? Für jede dieser Möglichkeiten muss in der Nachricht "Telegramm" u.U. etwas berücksichtigt werden, wie z.B. XML-Struktur oder JSon.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Freitag, 14. Mai 2021 13:33
  • Servus,

    Reihenfolge: Server wartet auf Port: 8888 ---> Client sendet auf Port: 8888 "hallo" ---> Server empfängt die Nachricht, speichert die IP ---> Server sendet an die IP des Clients über den Port 8889 "bin da" ---> Client empfängt die Nachricht und speichert die IP des Servers

    meinten sie dass?

    Die Nachricht ist ein einfacher string...

    Ja, es soll eine Art Telefonbuch werden, der Server speichert die IP-Adressen (Um an diese die Nachrichten zu senden). Sollte ein Client geschlossen werden sendet dieser dann eine "Good-Bye" Nachricht um sich beim Server abzumelden.

    Die Reihenfolge wird immer wieder wiederholt sollte ein Client nicht mehr da sein wird er aus dem Array gestrichen.

    Grüße


    Freitag, 14. Mai 2021 13:57
  • Hallo,

    MS bietet SignalR was eine gutes Tool ist um darauf einen Chat auszusetzen. Hier auch ein Beispiel wie man damit einen Chat erstellen kann 

    Tutorial: Erste Schritte mit ASP.NET Core SignalR

    SignalR kann man auch aus WinForms nutzen.

    Das ganze basiert auf WebSocket. Ich persönlich nutze SignalR nicht sondern direkt WebSocket. Der Einstieg in dieses Thema ist über SignalR aber einfacher.


    Gruß Thomas
    Github

    Freitag, 14. Mai 2021 18:42
  • Servus,

    tatsächlich soll über die Anwendung Dateien via. Memorystream verschickt werden.

    Die Anwendungen sollen sich nur vorher gegenseitig finden...

    Grüße

    Freitag, 14. Mai 2021 19:52
  • Übers Internet oder dem lokalen Netzwerk?

    im lokalen Netzwerk kann man mDNS nutzen.

    Übers Internet ist ein Server und z.B. WebSocket nötig wenn die Clients hinter einem Router mit NAT sind.

    Der Server fungiert als Knotenpunkt und hält die Verbindung zu den Client über WebSocket aufrecht. 

    Und genau das macht SignalR. Auch ein Stream ist mit SignalR/WebSocket möglich


    Gruß Thomas
    Github

    Freitag, 14. Mai 2021 20:07
  • Stimmt dass hab ich vergessen zu sagen, es soll alles im lokalem Netzwerk statt finden...

    Frage: Via. Internet bräuchte ich da Port-forwarding beim Router (Als Server)?

    Kleiner Spaß am Rand...

    Ich habe die Anwendung weiter programmiert und nach dem ich das Programm ausgeführt habe, hat sich Windows Defender gemeldet... Mit den Worten "Diese Anwendung ist gefährlich. Sie führt Befehle eines Angreifers aus." Warnstufe: Schwerwiegend (Trojaner)

    Leute was hab ich da zusammen Programmiert?!

    LG NStriker


    Samstag, 15. Mai 2021 11:59
  • Ja via Internet brauchst Du Port-Forwarding.

    Wenn wir dir helfen sollen muss Du schon deinen Code hier posten. So können wir nichts dazu sagen


    Gruß Thomas
    Github

    Sonntag, 16. Mai 2021 10:20
  • Hier wäre der Code...

    Server-Code:

     public void AskforClients()
            {            
                MessageBox.Show("Asking for Clients");
    
                var Server = new UdpClient(8888);
                var ResponseData = Encoding.ASCII.GetBytes("Somebody");
    
                while (true)
                {
                    MessageBox.Show("doing");
                    var ClientEp = new IPEndPoint(IPAddress.Any, 0);
    
                    var ClientRequestData = Server.Receive(ref ClientEp);//Wartet auf eine Nachricht vom Client.
                    var ClientRequest = Encoding.ASCII.GetString(ClientRequestData);
    
                    Clients.Add(ClientEp.Address.ToString()); //List<string>
    
                    MessageBox.Show("Client:" + ClientEp.Address.ToString() + " Nachricht: " + ClientRequest);
                    Server.Send(ResponseData, ResponseData.Length, ClientEp); // Sendet an den Client zurück...
                }
            }

    Client-Code:

    public void AskForServer()
            {
                ServerStatus_PB.Image = Properties.Resources.SearchWifi;
    
                MessageBox.Show("Asking for Server");
    
                var Client = new UdpClient();
                var RequestData = Encoding.ASCII.GetBytes("Anybody?");
                var ServerEp = new IPEndPoint(IPAddress.Any, 8888);
    
                Client.EnableBroadcast = true;
                Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, 0)); //Sendet via Broadcast einen String
    
                var ServerResponseData = Client.Receive(ref ServerEp); //Wartet auf die Nachricht vom Server
                var ServerResponse = Encoding.ASCII.GetString(ServerResponseData);
    
                ServerIP = ServerEp.Address.ToString(); //Speichert die IP-Adresse des Servers in einem String zum Senden von Daten
    
                MessageBox.Show("Server:" + ServerIP+ "Nachricht:" + ServerResponse);
    
                Client.Close();            
            }
    Die voids arbeiten als Threads, falls des hilft.

    Grüße


    Sonntag, 16. Mai 2021 13:52
  • Ist dir den auch bewusst das UDP Packet gar nicht ankommen müssen. Dem Protokoll ist das nämlich egal.

    Schau dir mal mDNS in diesem Github Projekt an net-mdns

    Ich glaube das ist das was Du eigentlich suchst

    Mit mDNS sendet der Server Nachrichten ins Netzwerk über Broadcast sodass die Clients ihm finden können


    Gruß Thomas
    Github


    Sonntag, 16. Mai 2021 14:37
  • Des ist mir auch auf gefallen als den Code gesendet habe... (UDP)

    Gibt es noch einen anderen weg dies zu ermöglichen? (TCP, ...)

    Sonntag, 16. Mai 2021 17:35
  • Wenn Du mDNS benutzt und sich damit die suche von Client und Server erledigt hat, dann kannst Du TCP benutzen. Ein Beispiel findest Du z.B. hier

    Socket Programming In C#


    Gruß Thomas
    Github

    Sonntag, 16. Mai 2021 19:38
  • Hallo NStriker-Code,

    Ich nehme an, dass Thomas' Antworten Dir weitergeholfen haben. Bitte lass uns wissen, wenn Du zusätzliche Fragen hast.

    Gruß,

    Ivan Dragov

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 3. Juni 2021 08:45
    Moderator