none
TCP-Nachrichten RRS feed

  • Frage

  • Guten Abend,

    ich möchte aktuell Nachrichten von einem UWP-Client an einen WPF-Server schicken.

    Vorab habe ich erst den Server entwickelt und danach den Client. Um die TCP-Nachrichten testen zu können habe ich folgendes Tool genutzt:

    https://sourceforge.net/projects/sockettest/

    Alles lief ohne Probleme, es wird alles ohne Probleme empfangen und gesendet, sowohl vom Client als auch vom Server.

    Nun sollte das zusammenbringen von Server und Client ja eigentlich ein Kinderspiel sein - falsch gedacht!

    Der Client verbindet sich zwar mit dem Server, allerdings kann ich keine Nachrichten an den Server senden. Was aber vorher mit dem Test-Tool wunderbar geklappt hat.

    Hier ist einmal das senden der Nachricht vom Client:

    public static async Task send(string message)
            {
                DataWriter writer;
                using (writer = new DataWriter(socket.OutputStream))
                {
                    writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
                    writer.ByteOrder = ByteOrder.LittleEndian;
                    writer.MeasureString(message);
                    writer.WriteString(message);
                    try
                    {
                        await writer.StoreAsync();
                    }
                    catch (Exception exception)
                    {
                        Connected = false;
                        switch (SocketError.GetStatus(exception.HResult))
                        {
                            case SocketErrorStatus.HostNotFound:
                                throw;
                            default:
                                throw;
                        }
                    }
                    await writer.FlushAsync();
                    writer.DetachStream();
                }
            }

    Und die Server-Seite:

    myServer = New TcpListener(myIpEndpoint)
    myServer.Start()
    myClient = myServer.AcceptTcpClient
    Dim tmpCon As New TCPConnection
    tmpCon.Stream = myClient.GetStream
    tmpCon.Streamr = New StreamReader(tmpCon.Stream)
    tmpCon.Nick = tmpCon.Streamr.ReadLine

    Die erste Nachricht die dabei Empfangen werden soll ist der "Nick" des Clients, um einen Anmeldevorgang einzuleiten.

    Allerdings wird der asynchrone Aufruf der folgenden Zeile nie beendet:

    tmpCon.Nick = tmpCon.Streamr.ReadLine

    So als würde halt nichts empfangen werden. Das kann ich aber absolut nicht nachvollziehen, da mit dem Tool alles ohne Probleme funktionierte.

    Ich hoffe ihr habt eine Idee, woran es liegen könnte.

    Gruß

    Marcel Payne

    Mittwoch, 3. August 2016 17:17

Antworten

  • So, auch mal schön sich selber die Antwort geben zu können.

    Die als "problematisch" ausgemachte Zeile:

    tmpCon.Nick = tmpCon.Streamr.ReadLine

    hat die Eigenschaft so lange den Input zu lesen bis ein Zeilenumbruch kommt. (ReadLINE halt :D)

    Beim erneuten Nutzen des SockeTesters ist mir aufgefallen das genau diese Zeilenumbrüche bei meinem UWP-Client fehlten.

    Auf verdacht einfach mal der Nachricht ein "\n" hinzugefügt und siehe da, es funktioniert.

    Die send-Methode sieht nun folgendermaßen aus:

    public static async Task send(string message)
            {
                DataWriter writer;
                using (writer = new DataWriter(socket.OutputStream))
                {
                    writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                    writer.ByteOrder = ByteOrder.LittleEndian;
                    writer.MeasureString(message + "\n");
                    writer.WriteString(message + "\n");
                    try
                    {
                        await writer.StoreAsync();
                    }
                    catch (Exception exception)
                    {
                        Connected = false;
                        switch (SocketError.GetStatus(exception.HResult))
                        {
                            case SocketErrorStatus.HostNotFound:
                                throw;
                            default:
                                throw;
                        }
                    }
                    await writer.FlushAsync();
                    writer.DetachStream();
                }
            }

    Danke noch einmal an Dimitar.

    Gruß Marcel


    • Als Antwort markiert Marcel Payne Donnerstag, 4. August 2016 23:18
    • Bearbeitet Marcel Payne Donnerstag, 4. August 2016 23:18
    Donnerstag, 4. August 2016 23:17

Alle Antworten

  • Hallo Marcel,

    Ändert sich etwas, wenn Du es mit der lokalen IP-Adresse versuchst (sie ist mit der NetworkInformation.GetHostNames()-Methode abrufbar)? Wenn es nur dann klappt, sieh Dir diesen Thread an:
    TCP Senden Fehler

    Gruß,
    Dimitar


    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, 4. August 2016 17:13
    Moderator
  • Hi Dimitar,

    danke für den Tipp, aber überall das selbe Problem, egal ob:

    localhost

    127.0.0.1

    Computername

    IPv4-Adresse

    der Client verbindet sich, aber gesendete Nachrichten kommen nicht am Server an.

    Gruß Marcel

    Donnerstag, 4. August 2016 17:39
  • So, auch mal schön sich selber die Antwort geben zu können.

    Die als "problematisch" ausgemachte Zeile:

    tmpCon.Nick = tmpCon.Streamr.ReadLine

    hat die Eigenschaft so lange den Input zu lesen bis ein Zeilenumbruch kommt. (ReadLINE halt :D)

    Beim erneuten Nutzen des SockeTesters ist mir aufgefallen das genau diese Zeilenumbrüche bei meinem UWP-Client fehlten.

    Auf verdacht einfach mal der Nachricht ein "\n" hinzugefügt und siehe da, es funktioniert.

    Die send-Methode sieht nun folgendermaßen aus:

    public static async Task send(string message)
            {
                DataWriter writer;
                using (writer = new DataWriter(socket.OutputStream))
                {
                    writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                    writer.ByteOrder = ByteOrder.LittleEndian;
                    writer.MeasureString(message + "\n");
                    writer.WriteString(message + "\n");
                    try
                    {
                        await writer.StoreAsync();
                    }
                    catch (Exception exception)
                    {
                        Connected = false;
                        switch (SocketError.GetStatus(exception.HResult))
                        {
                            case SocketErrorStatus.HostNotFound:
                                throw;
                            default:
                                throw;
                        }
                    }
                    await writer.FlushAsync();
                    writer.DetachStream();
                }
            }

    Danke noch einmal an Dimitar.

    Gruß Marcel


    • Als Antwort markiert Marcel Payne Donnerstag, 4. August 2016 23:18
    • Bearbeitet Marcel Payne Donnerstag, 4. August 2016 23:18
    Donnerstag, 4. August 2016 23:17