none
TCPClient - Socket, ReadTimeout - WriteTimeout RRS feed

  • Frage

  • Hallo,

    ich will es nur verstehen, wie das seitens Microsoft angedacht ist.

    NetworkStream networkStream = tcpClient.GetStream();
    // Set a 10 millisecond timeout for reading.
    networkStream.ReadTimeout = 10;
    // Read the server message into a byte buffer.
    byte[] bytes = new byte[1024];
    networkStream.Read(bytes, 0, 1024);

    ReadTimeout ist die Zeit, die ich zum Lesen einer Nachricht gebe.

    Mit Read kann ich alles einlesen, in der Regel, geht man auf einer vordefinierten Länge oder auf LineFeed(>90%)

    Ich brauche weder StreamReader noch StreamWriter, alles geht über Networkstream.

    Wenn ich ReadLine nutzen möchte, würde ich diese Hilfsklassen benötigen.

    Ist dem so oder ist es anders?

    Danke für Antworten.

    Viele Grüße Oliver

    Dienstag, 1. August 2017 10:37

Antworten

  • Hi Oliver,
    empfehlenswert ist immer, mal in die Hilfe zu schauen.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 2. August 2017 21:09
  • Hi Oliver,
    in der folgenden Demo kannst Du mal mit den Parametern spielen:

    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
      class Program14
      {
        static void Main(string[] args)
        {
          try
          {
            Server s = new Server();
            s.Execute();
            Client c1 = new Client() { Name = "Client 1" };
            c1.Execute();
            Client c2 = new Client() { Name = "Client 2" };
            c2.Execute();
            Console.WriteLine("Weiter, beenden mit beliebiger Taste");
            Console.ReadKey();
            c2.Stop();
            c1.Stop();
            s.Stop();
          }
          catch (Exception ex) { Console.WriteLine(ex.ToString()); }
          Console.Write("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        /// <summary>
        /// Klasse, die serverseitige Funktionen realisiert
        /// </summary>
        internal class Server
        {
          private int _listeningPort = 5000;
          CancellationTokenSource source = new CancellationTokenSource();
          CancellationToken token;
          public Server() { token = source.Token; }
          internal Task Execute() { return (new TaskFactory(token)).StartNew(Start); }
          internal void Stop() { source.Cancel(); }
          public async void Start()
          {
            IPAddress ipAddre = IPAddress.Loopback;
            TcpListener listener = new TcpListener(ipAddre, _listeningPort);
            listener.Start();
            LogMessage("Server is running");
            LogMessage("Listening on port " + _listeningPort);
            while (true)
            {
              LogMessage("Waiting for connections...");
              try
              {
                var tcpClient = await listener.AcceptTcpClientAsync();
                HandleConnectionAsync(tcpClient);
              }
              catch (Exception exp) { LogMessage(exp.ToString()); }
            }
          }
    
          /// <summary>
          /// mit aufgebauter Verbindung auf Sockets warten
          /// </summary>
          /// <param name="tcpClient">client connections for TCP network services</param>
          private void HandleConnectionAsync(TcpClient tcpClient)
          {
            tcpClient.LingerState.Enabled = false;
            string clientInfo = tcpClient.Client.RemoteEndPoint.ToString();
            LogMessage(string.Format("Got connection request from {0}", clientInfo));
            try
            {
              using (NetworkStream str = tcpClient.GetStream())
              {
                str.ReadTimeout = 60;
                using (StreamReader rdr = new StreamReader(str))
                  while (!rdr.EndOfStream) LogMessage($"Receive from Client:{rdr.ReadLine()}");
              }
            }
            catch (Exception exp) { LogMessage(exp.Message); }
            finally
            {
              LogMessage(string.Format("Closing the client connection - {0}", clientInfo));
              tcpClient.Close();
            }
          }
          internal void LogMessage(string msg) => Console.WriteLine("Server: " + msg);
        }
    
        /// <summary>
        /// Klasse, die clientseitige Funktionen realisiert
        /// </summary>
        internal class Client
        {
          internal string Name { get; set; }
          private byte[] _host = new byte[] { 127, 0, 0, 1 };
          private int _port = 5000;
          CancellationTokenSource source = new CancellationTokenSource();
          CancellationToken token;
          public Client() { token = source.Token; }
          internal Task Execute() { return (new TaskFactory(token)).StartNew(Start); }
          internal void Stop() { source.Cancel(); }
          public void Start()
          {
            IPAddress[] IPs = new IPAddress[] { new IPAddress(_host) };
            TcpClient tcpClient = new TcpClient();
            LogMessage($"Establishing Connection to {_host[0]}.{_host[1]}.{_host[2]}.{_host[3]}");
            tcpClient.Connect(IPs[0], _port);
            LogMessage($"Connection established");
            using (NetworkStream str = tcpClient.GetStream())
            {
              //str.WriteTimeout= 10;
              using (StreamWriter wrt = new StreamWriter(str))
              {
                for (int i = 0; i < 10; i++)
                {
                  wrt.Write($"{Name}: ");
                  for (int k = 1; k < i+1; k++)
                  {
                    wrt.Write("x");
                    Thread.Sleep(1);
                  }
                  wrt.WriteLine($"Zeile {i} gesendet.");
                }
              }
            }
            Thread.Sleep(200);
            LogMessage($"{Name}: alle Daten versendet.");
          }
          internal void LogMessage(string msg) => Console.WriteLine($"{Name}: " + msg);
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 3. August 2017 21:27

Alle Antworten

  • Hi Oliver,
    Deine Frage ist etwas unklar. StreamReader und StreamWriter ist es egal, woher der Stream kommt, d.h. welche Klasse vom Stream geerbt hat. Es wird eine Funktionalität gekapselt und damit vom Bereitsteller des Streams entkoppelt. Zusätzlich sind dann noch Funktionalitäten implementiert, die unabhängig von der Quelle sind, woher der Stream kommt, wie Encoding, Erkennung Zeilenende usw. Diese Funktionalitäten kannst Du auch selbst implementieren oder Dir den Aufwand sparen und vorgefertigte Klassen wie StreamReader und StreamWriter nutzen.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 2. August 2017 04:19
  • Hallo Peter,

    • networkStream.ReadTimeout = 10;
    • networkStream.WriteTimeout = 10;

    Kannst hierzu noch etwas sagen.

    StreamReader und StreamWriter  soweit klar. Danke.

    Viele Grüße Oliver

    Mittwoch, 2. August 2017 16:43
  • Hi Oliver,
    empfehlenswert ist immer, mal in die Hilfe zu schauen.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 2. August 2017 21:09

  • empfehlenswert ist immer, mal in die Hilfe zu schauen.

    Hallo Peter,

    hast ja recht, wie immer. ;-)

    Ich wollte ja nur wissen, ob ich es richtig sehe. Nach Aufruf von Read, startet die Zeit, sonst kommt eine IOException.

    Grüße Oliver


    Donnerstag, 3. August 2017 16:31
  • Hi Oliver,
    in der folgenden Demo kannst Du mal mit den Parametern spielen:

    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
      class Program14
      {
        static void Main(string[] args)
        {
          try
          {
            Server s = new Server();
            s.Execute();
            Client c1 = new Client() { Name = "Client 1" };
            c1.Execute();
            Client c2 = new Client() { Name = "Client 2" };
            c2.Execute();
            Console.WriteLine("Weiter, beenden mit beliebiger Taste");
            Console.ReadKey();
            c2.Stop();
            c1.Stop();
            s.Stop();
          }
          catch (Exception ex) { Console.WriteLine(ex.ToString()); }
          Console.Write("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        /// <summary>
        /// Klasse, die serverseitige Funktionen realisiert
        /// </summary>
        internal class Server
        {
          private int _listeningPort = 5000;
          CancellationTokenSource source = new CancellationTokenSource();
          CancellationToken token;
          public Server() { token = source.Token; }
          internal Task Execute() { return (new TaskFactory(token)).StartNew(Start); }
          internal void Stop() { source.Cancel(); }
          public async void Start()
          {
            IPAddress ipAddre = IPAddress.Loopback;
            TcpListener listener = new TcpListener(ipAddre, _listeningPort);
            listener.Start();
            LogMessage("Server is running");
            LogMessage("Listening on port " + _listeningPort);
            while (true)
            {
              LogMessage("Waiting for connections...");
              try
              {
                var tcpClient = await listener.AcceptTcpClientAsync();
                HandleConnectionAsync(tcpClient);
              }
              catch (Exception exp) { LogMessage(exp.ToString()); }
            }
          }
    
          /// <summary>
          /// mit aufgebauter Verbindung auf Sockets warten
          /// </summary>
          /// <param name="tcpClient">client connections for TCP network services</param>
          private void HandleConnectionAsync(TcpClient tcpClient)
          {
            tcpClient.LingerState.Enabled = false;
            string clientInfo = tcpClient.Client.RemoteEndPoint.ToString();
            LogMessage(string.Format("Got connection request from {0}", clientInfo));
            try
            {
              using (NetworkStream str = tcpClient.GetStream())
              {
                str.ReadTimeout = 60;
                using (StreamReader rdr = new StreamReader(str))
                  while (!rdr.EndOfStream) LogMessage($"Receive from Client:{rdr.ReadLine()}");
              }
            }
            catch (Exception exp) { LogMessage(exp.Message); }
            finally
            {
              LogMessage(string.Format("Closing the client connection - {0}", clientInfo));
              tcpClient.Close();
            }
          }
          internal void LogMessage(string msg) => Console.WriteLine("Server: " + msg);
        }
    
        /// <summary>
        /// Klasse, die clientseitige Funktionen realisiert
        /// </summary>
        internal class Client
        {
          internal string Name { get; set; }
          private byte[] _host = new byte[] { 127, 0, 0, 1 };
          private int _port = 5000;
          CancellationTokenSource source = new CancellationTokenSource();
          CancellationToken token;
          public Client() { token = source.Token; }
          internal Task Execute() { return (new TaskFactory(token)).StartNew(Start); }
          internal void Stop() { source.Cancel(); }
          public void Start()
          {
            IPAddress[] IPs = new IPAddress[] { new IPAddress(_host) };
            TcpClient tcpClient = new TcpClient();
            LogMessage($"Establishing Connection to {_host[0]}.{_host[1]}.{_host[2]}.{_host[3]}");
            tcpClient.Connect(IPs[0], _port);
            LogMessage($"Connection established");
            using (NetworkStream str = tcpClient.GetStream())
            {
              //str.WriteTimeout= 10;
              using (StreamWriter wrt = new StreamWriter(str))
              {
                for (int i = 0; i < 10; i++)
                {
                  wrt.Write($"{Name}: ");
                  for (int k = 1; k < i+1; k++)
                  {
                    wrt.Write("x");
                    Thread.Sleep(1);
                  }
                  wrt.WriteLine($"Zeile {i} gesendet.");
                }
              }
            }
            Thread.Sleep(200);
            LogMessage($"{Name}: alle Daten versendet.");
          }
          internal void LogMessage(string msg) => Console.WriteLine($"{Name}: " + msg);
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 3. August 2017 21:27
  • Hallo Peter!

    Dankeschön. Ist hilfreich.

    Viele Grüße Oliver

    Freitag, 4. August 2017 15:33