Benutzer mit den meisten Antworten
TCPClient - Socket, ReadTimeout - WriteTimeout

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
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- Als Antwort markiert Oliver Müller12 Donnerstag, 3. August 2017 16:40
-
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- Als Antwort markiert Oliver Müller12 Freitag, 4. August 2017 15:32
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 -
Hi Oliver,
empfehlenswert ist immer, mal in die Hilfe zu schauen.--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Oliver Müller12 Donnerstag, 3. August 2017 16:40
-
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
- Bearbeitet Oliver Müller12 Donnerstag, 3. August 2017 16:42
-
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- Als Antwort markiert Oliver Müller12 Freitag, 4. August 2017 15:32