none
Netzwerkkommunikation mittels C# RRS feed

  • Frage

  • Hallo, 

    ich versuche gerade eine Netzwerkkommunikation zwischen zwei Rechnern zu realisieren. Auf dem zweiten Rechner läuft ein Beispielskript in Python, welches erst einmal die gesendeten Daten anzeigt, bzw. Tastatureingaben über LAN versendet.

    An meinem anderen Rechner soll eine WPF Anwendung laufen, welche Zeichen senden und empfangen kann. Das Senden funktioniert schon mal, aber das Empfangen nicht....
    Meine Idee war, dass mit Hilfe eines Timers jede Sekunde geschaut wird ob was angekommen ist (gibt es vielleicht eine bessere Methode?)
    In der Textbox fürs Empfangen wird aber nichts angezeigt :(

    Wo habe ich einen Fehler?
    Vielen Dank für die Hilfe!

    Gruß
    Daniel

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Timers;
    
    namespace Steuerung
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            TcpClient Client = new TcpClient();
            NetworkStream Stream;
            BinaryWriter W_Stream;
            BinaryReader R_Stream;
            Timer LANTimer;
            String String_Empfangen;
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Connect_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    // Verbindung herstellen
                    Client.Connect(IPAddress.Parse(Textbox_IP.Text), Convert.ToInt32(Textbox_Port.Text));
    
                    // Den Netzwerk-Stream abrufen.
                    Stream = Client.GetStream();
    
                    // Einen BinaryWriter erstellen, um in den Stream zu schreiben.
                    W_Stream = new BinaryWriter(Stream);
    
                    // Einen BinaryReader erstellen, um aus dem Stream zu lesen.
                    R_Stream = new BinaryReader(Stream);
    
                    // Statusmeldung in "Verbunden" ändern
                    Textbox_Status.Text = "Verbunden";
    
                    // Timer starten
                    LANTimer = new System.Timers.Timer(1000);
                    LANTimer.Elapsed += new ElapsedEventHandler(Empfangen);
                    LANTimer.Enabled = true;
    
                    // Schaltflächen aktivieren
                    Button_Disconnect.IsEnabled = true;
                    Button_Senden.IsEnabled = true;
                    Textbox_Senden.IsEnabled = true;
                    Textbox_Empfangen.IsEnabled = true;
                }
                catch (Exception err)
                {
                    // Fehlermeldung ausgeben
                    Textbox_Status.Text = err.ToString();
                }
            }
    
            private void Button_Senden_Click(object sender, RoutedEventArgs e)
            {
                // Nachricht versenden
                W_Stream.Write(Textbox_Senden.Text);
            }
    
            private void Button_Disonnect_Click(object sender, RoutedEventArgs e)
            {
                // Timer stoppen
                LANTimer.Elapsed -= new ElapsedEventHandler(Empfangen);
                LANTimer.Enabled = false;
    
                // Verbindung beenden
                Client.Close();
    
                // Schaltflächen deaktivieren
                Button_Disconnect.IsEnabled = false;
                Textbox_Senden.IsEnabled = false;
                Button_Senden.IsEnabled = false;
                Textbox_Empfangen.IsEnabled = false;
                Textbox_Senden.Text = "";
    
                // Statusmeldung ändern
                Textbox_Status.Text = "Verbindung getrennt";
            }
    
            private void Empfangen(object source, ElapsedEventArgs e)
            {
                String_Empfangen = R_Stream.ReadString();
                Textbox_Empfangen.Text = String_Empfangen;
            }
        }
    }
    

    Sonntag, 27. April 2014 15:41

Alle Antworten

  • Hallo,

    danke für die Antwort.
    Habs erst einmal in einer Konsolenanwendung probiert (da hat es geklappt) und versuche es nun auf meine WPF Anwendung zu übertragen.

    Allerdings erscheint nun folgender Fehler, wenn ich was an meinen Windows Rechner sende.

    Danke und Gruß

    Daniel

    Montag, 28. April 2014 14:55
  • Hi Daniel,

    schau mal hier. Du bist nicht der erste der dasa Problem hat. ;)

    MFG

    Björn

    Montag, 28. April 2014 15:50
  • Hallo Björn,

    danke für den Link. So halbwegs verstanden habe ich das Problem, aber ich kann mir keinen Reim drauf machen, wie ich das in meinen Code packen muss (programmiere nicht viel in C#, von daher habe ich ein paar Probleme).

    Gruß
    Daniel

    Montag, 28. April 2014 16:56
  • Hi Daniel,

    nun wirklich gut kann man den Code nicht lesen. Und aus dem was da ist sehe ich jetzt auch nicht wieso die Textbox in einem anderen Thread ist. Schau dir mal die Details der Exception an und da unteranderem auch mal in den StackTrace. Da solltest du genaueres finden. Bitte dann auch auch Posten, wenn fragen sind.

    Könnte auch an dem Timer liegen, die sind nicht alle ThreadSave. Schau hier.

    Das du mit dem Reader und Writer auf dem gleichen Stream Arbeitest kommt mir auch sehr fragwürdig vor. Wenn einer von beiden geschloßen wird, wird wohl auch der zugrunde liegende Stream geschloßen.

    Stell für das Empfangen einen TCPServer bereit (Server und Client Implementierung findest du hier), Und Erstell am besten für beide eigene Klassen (OOP, Lesbarkeit usw.).  Fals du einen asyncronen Server brauchst schau dir mal den Link an.

    Montag, 28. April 2014 18:25
  • Hey,

    ich poste mal meinen geänderten Code nochmal :)
    Fürs Empfangen auf dem anderen Rechner habe ich bereits einen Server realisiert. Das Programm was ich im Moment schreiben möchte soll ein einfaches Steuerungsprogramm (also ein Client) werden, der Daten zum Server schickt und auf Antworten wartet.

    In den Details steht einfach nur "InvalidOperationException"

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Timers;
    
    namespace Steuerung
    {
        /// <summary>
        /// Interaktionslogik für MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            TcpClient Client = new TcpClient();
            NetworkStream Stream;
            Timer LANTimer;
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Connect_Click(object sender, RoutedEventArgs e)
            {
                try
                {
                    // Verbindung herstellen
                    Client.Connect(IPAddress.Parse(Textbox_IP.Text), Convert.ToInt32(Textbox_Port.Text));
    
                    // Den Netzwerk-Stream abrufen.
                    Stream = Client.GetStream();
    
                    Send_Lan("Verbindung hergestellt");
    
                    // Statusmeldung in "Verbunden" ändern
                    Textbox_Status.Text = "Verbunden";
    
                    // Timer starten
                    LANTimer = new System.Timers.Timer(1000);
                    LANTimer.Elapsed += new ElapsedEventHandler(Empfangen);
                    LANTimer.Enabled = true;
    
                    // Schaltflächen aktivieren
                    Button_Disconnect.IsEnabled = true;
                    Button_Senden.IsEnabled = true;
                    Textbox_Senden.IsEnabled = true;
                    Textbox_Empfangen.IsEnabled = true;
                }
                catch (Exception err)
                {
                    // Fehlermeldung ausgeben
                    Textbox_Status.Text = err.ToString();
                }
            }
    
            private void Button_Senden_Click(object sender, RoutedEventArgs e)
            {
            }
    
            private void Button_Disonnect_Click(object sender, RoutedEventArgs e)
            {
                // Timer stoppen
                LANTimer.Elapsed -= new ElapsedEventHandler(Empfangen);
                LANTimer.Enabled = false;
    
                Send_Lan("Verbindung getrennt");
    
                // Verbindung beenden
                Client.Close();
                Stream.Close();
    
                // Schaltflächen deaktivieren
                Button_Disconnect.IsEnabled = false;
                Textbox_Senden.IsEnabled = false;
                Button_Senden.IsEnabled = false;
                Textbox_Empfangen.IsEnabled = false;
                Textbox_Senden.Text = "";
    
                // Statusmeldung ändern
                Textbox_Status.Text = "Verbindung getrennt";
            }
    
            private void Empfangen(object source, ElapsedEventArgs e)
            {
                Byte[] data = new Byte[256];
                String responseData = String.Empty;
                Int32 bytes = Stream.Read(data, 0, data.Length);
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
                Textbox_Empfangen.Text = responseData;
            }
    
            void Send_Lan(String Nachricht)
            {
                Byte[] Daten;
    
                Daten = System.Text.Encoding.ASCII.GetBytes(Nachricht);
                Stream.Write(Daten, 0, Daten.Length);
            }
        }
    }
    

    Montag, 28. April 2014 19:30