tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
713
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    kletoris kletoris ist offline Rookie
    Registriert seit
    Aug 2010
    Beiträge
    8
    Hallo,

    ich habe ein Problem mit einem StreamReader und ich habe keine ahnung warum er nicht funktioniert. Ich hoffe ihr könnt mir helfen.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
     
    namespace VerbindungKlasseTest
    {
        static class Verbindung
        {
            // Enum das die Anfragen an den Server beschreibt
            public enum Status
            {
                LoginAkzeptiert,
                LoginAbgelehnt,
                RegistrationAkzeptiert,
                RegistrationAbgelehnt
            }
            #region Variablen
     
            // Die Variable die die aufzurufende Methode enthält
            internal static OnServerReceivesMessage NachrichtEmpfangenEvent;
     
            // Delegate zum aufrufen des Events
            internal delegate void OnServerReceivesMessage(string nachricht);
     
            // Die Verbindung zum Server
            private static TcpClient _server;
     
            // Zum lesen von Informationen aus dem Stream des Servers
            private static StreamReader _streamReader;
     
            // Zum schreiben von Informationen in den Stream des Servers
            private static StreamWriter _streamWriter;
     
            // Gibt an ob man Verbunden ist
            public static bool Verbunden { get; private set; }
     
            // Der Thread um Nachrichten zu Empfangen
            private static Thread _nachrichtEmpfangen;
     
            #endregion
            
            /// <summary>
            /// Die Verbindung zum Server aufbauen
            /// </summary>
            /// <param name="ipAddress">Die IP-Adresse des Servers</param>
            /// <param name="port">Der Port auf dem der Server läuft</param>
            public static void Verbinden(IPAddress ipAddress, int port)
            {
                // Die verbindung instanzieren und verbinden
                _server = new TcpClient();
                _server.Connect(ipAddress, port);
                // Wenn man verbunden ist
                if (_server.Connected)
                {
                    // StreamReader und Streamwriter mit dem Stream des Servers instanzieren
                    NetworkStream stream = _server.GetStream();
                    _streamReader = new StreamReader(stream);
                    _streamWriter = new StreamWriter(stream);
                    // Gibt an das man verbunden ist
                    Verbunden = true;
                    // Den Thread zum Nachrichten Empfangen starten
                    _nachrichtEmpfangen =  new Thread(NachrichtEmpfangen);
                    _nachrichtEmpfangen.Start();
                }
            }
     
            /// <summary>
            /// Die Verbindung zum Server trennen
            /// </summary>
            public static void Trennen()
            {
                if (Verbunden)
                {
                    try
                    {
                        if (_server != null)
                        {
                            _server.Close();
                        }
                        if (_streamReader != null)
                        {
                            _streamReader.Close();
                            _streamReader.Dispose();
                        }
                        if (_streamWriter != null)
                        {
                            _streamWriter.Close();
                            _streamWriter.Dispose();
                        }
                        if (_nachrichtEmpfangen.IsAlive)
                        {
                            _nachrichtEmpfangen.Abort();
                        }
                    }
                    finally 
                    {
                        Verbunden = false;
                    }
                }
            }
     
            /// <summary>
            /// Sendet eine Nachricht an den Server
            /// </summary>
            /// <param name="nachricht">Die zusendende Nachricht</param>
            public static void NachrichtSenden(string nachricht)
            {
                if (!string.IsNullOrEmpty(nachricht))
                {
                    _streamWriter.WriteLine(nachricht);
                    _streamWriter.Flush();
                }
            }
     
            private static void NachrichtEmpfangen()
            {
                while (Verbunden)
                {
                    string read = _streamReader.ReadLine();
                    BeiNachrichtEmpfangen(read);
                }
            }
     
            private static void BeiNachrichtEmpfangen(string nachricht)
            {
                OnServerReceivesMessage serverReceivesMessage = NachrichtEmpfangenEvent;
     
                if (serverReceivesMessage != null)
                {
                    serverReceivesMessage(nachricht);
                }
            }
        }
    }

    Vielen Dank im Vorraus.

    MfG
    Klemens
     

  2. #2
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Was funktioniert nicht? Wie äußert sich der Fehler? Gibt es eine Fehlermeldung?
     
    hihi = -h²

  3. #3
    kletoris kletoris ist offline Rookie
    Registriert seit
    Aug 2010
    Beiträge
    8
    Es gibt keine Fehlermeldung, nur der StreamReader liest nichts vom Stream ein wenn ich von einem anderen Programm etwas sende.
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Ich habe es gerade mal mit einem simplen Echo-Server ausprobiert und es funktioniert problemlos:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    public static void RunSnippet()
        {
            Verbindung.Verbinden(IPAddress.Parse("127.0.0.1"), 50000);
            Verbindung.NachrichtEmpfangenEvent += (x) => { WL("server> {0}", x); };
            try {
                string l;
                while ((l = RL()) != null) {
                    Verbindung.NachrichtSenden(l);
                }
            } finally {
                Verbindung.Trennen();
            }
        }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    kletoris kletoris ist offline Rookie
    Registriert seit
    Aug 2010
    Beiträge
    8
    Für was steht dein WL und RL in deinem Code? Console.WriteLine und Console.ReadLine?
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von kletoris Beitrag anzeigen
    Für was steht dein WL und RL in deinem Code? Console.WriteLine und Console.ReadLine?
    Ja. Ich verwende den SnippetCompiler (http://www.sliver.com/dotnet/SnippetCompiler/), dieser definiert diese Hilfsmethoden bereits vor (wobei ich die RL etwas angepasst habe).

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    kletoris kletoris ist offline Rookie
    Registriert seit
    Aug 2010
    Beiträge
    8
    Warum funktioniert die Klasse nicht wenn ich sie so verwende:

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
     
                Verbindung.NachrichtEmpfangenEvent += AppendText;
            }
     
            private void AppendText(string nachricht)
            {
                textBox2.AppendText(nachricht);
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    if (Verbindung.Verbunden)
                    {
                        Verbindung.Trennen();
                    }
                    else
                    {
                        Verbindung.Verbinden(IPAddress.Parse("127.0.0.1"), 1993);
                    }
                }
                catch
                {
                    MessageBox.Show("Fehler bei Verbindung");
                }
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                if (textBox1.TextLength != 0 && Verbindung.Verbunden)
                {
                    Verbindung.NachrichtSenden(textBox1.Text);
                }
            }
        }
     

  8. #8
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Hi

    nur mal so ins Blaue vermutet, ohne den kompletten Code gelesen zu haben:
    Du willst den Textboxinhalt aus einem anderen Thread ändern.
    Das mag .NET nicht ganz.
    Mit einer Suche nach "Invoke invokerequired" findet man viele Beispiele, wie man das löst.

    Gruß
     

  9. #9
    kletoris kletoris ist offline Rookie
    Registriert seit
    Aug 2010
    Beiträge
    8
    Mit Invoken funktionierts auch nicht

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
     
                Verbindung.NachrichtEmpfangenEvent += AppendText;
            }
     
            private void AppendText(string nachricht)
            {
                InvokeIfRequired(textBox2, (MethodInvoker) (() => textBox2.AppendText(nachricht)));
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    if (Verbindung.Verbunden)
                    {
                        Verbindung.Trennen();
                    }
                    else
                    {
                        Verbindung.Verbinden(IPAddress.Parse("127.0.0.1"), 50000);
                    }
                }
                catch
                {
                    MessageBox.Show("Fehler bei Verbindung");
                }
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                if (textBox1.TextLength != 0 && Verbindung.Verbunden)
                {
                    Verbindung.NachrichtSenden(textBox1.Text);
                }
            }
     
            private void InvokeIfRequired(Control target, Delegate methodToInvoke)
            {
                /* Mit Hilfe von InvokeRequired wird geprüft ob der Aufruf direkt an die UI gehen kann oder
                 * ob ein Invokeing hier von Nöten ist
                 */
                if (target.InvokeRequired)
                {
                    // Das Control muss per Invoke geändert werden, weil der aufruf aus einem Backgroundthread kommt
                    target.Invoke(methodToInvoke);
                }
                else
                {
                    // Die Änderung an der UI kann direkt aufgerufen werden.
                    methodToInvoke.DynamicInvoke();
     
     
                }
            }
     

  10. #10
    kletoris kletoris ist offline Rookie
    Registriert seit
    Aug 2010
    Beiträge
    8
    Hat sich erledigt, habe nach dem Senden vergessen den StreamWriter zu Flushen.
     

Ähnliche Themen

  1. Streamreader und Excel Zeilen
    Von Arijane im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 24.11.08, 14:53
  2. Sporadisches Problem mit StreamReader
    Von jokakilla im Forum .NET Web und Kommunikation
    Antworten: 4
    Letzter Beitrag: 15.07.07, 22:00
  3. TCP Client mit StreamReader beenden
    Von JJB im Forum .NET Web und Kommunikation
    Antworten: 4
    Letzter Beitrag: 11.07.07, 08:27
  4. TCP Problem: Lauschen an StreamReader ?
    Von JJB im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 15.06.04, 10:01
  5. [Sockets]Streamreader problem
    Von Badmaster im Forum PHP
    Antworten: 9
    Letzter Beitrag: 13.06.03, 19:54