Fragensteller
Netzwerkkommunikation mittels C#

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ß
Danielusing 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; } } }
Alle Antworten
-
Hi,
Schau Dir mal folgende Diskussion an .
Viele Grüße,
Ciprian
Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
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
-
-
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.
-
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); } } }