Benutzer mit den meisten Antworten
TCP Programm, DNS Name des Servers abrufen.

Frage
-
Hallo,
ich habe nun mit einem recht einfachen Programm begonnen. Mit diesem wird die SystemZeit des Servers an alle Clients übertragen. Ich habe nun 2 Probleme:
1.Aus irgendeinem Grund schließt sich der Server nicht. Obwohl das Ende, des Codes ereicht sein müsste...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.IO; using System.Net.Sockets; using System.Collections; namespace TimeServer { public class TimeServer { private static TcpListener listener = null; private static ArrayList threads = new ArrayList(); public static void Main(string[] args) { Console.WriteLine("Wilkommen. Starte...."); listener = new TcpListener(4711); listener.Start(); Thread th = new Thread(new ThreadStart(Run)); th.Start(); string cmd = ""; while(cmd.ToLower() != "stop") { cmd = Console.ReadLine(); if(cmd != "stop") { Console.WriteLine("Unbekannter Befehl"); } } foreach(TimeThread stopth in threads) { stopth.stop = true; } th.Abort(); listener.Stop(); } public static void Run() { while (true) { Console.WriteLine("Warte auf Client."); TcpClient c = listener.AcceptTcpClient(); Console.WriteLine("Client gefunden! Übertragung gestartet!"); threads.Add(new TimeThread(c)); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.IO; using System.Threading; namespace TimeServer { class TimeThread { public bool running; public bool stop = false; private TcpClient connection = null; public TimeThread(TcpClient connection) { running = true; this.connection = connection; Thread th = new Thread(new ThreadStart(Run)); th.Start(); } public void Run() { running = true; string buf = null; bool loop = true; while (loop == true) { String time = DateTime.Now.ToString(); if (time != buf) { Byte[] sendBytes = Encoding.ASCII.GetBytes(time + "\r\n"); try { Stream outStream = connection.GetStream(); outStream.Write(sendBytes, 0, sendBytes.Length); } catch { connection.Close(); running = false; } buf = time; } if (stop == true) loop = false; } if (stop == true && running == true) { Console.WriteLine("Verbindung wird getrennt."); connection.Close(); running = false; } } } }
2. Das zweite beruht nicht auf einem simplen Fehler meinerseits.
Um einen TCP Client zu erzeugen muss ich die DNS Adresse des Hostes angeben. Klar kann ich einfach die meines Pcs nehmen, wie kann ich aber auch von einem anderen Computer aus auf dieses Zugreifen?
LG
Antworten
-
Hallo,
1) Ungefähr so:
namespace TimeServer { public class TimeServer { private static TcpListener listener = null; private static ArrayList threads = new ArrayList(); public static void Main(string[] args) { Console.WriteLine("Wilkommen. Starte...."); listener = new TcpListener(4711); listener.Start(); Thread th = new Thread(new ThreadStart(Run)); th.Start(); string cmd = ""; while(cmd.ToLower() != "stop") { cmd = Console.ReadLine(); if(cmd != "stop") { Console.WriteLine("Unbekannter Befehl"); } } foreach(TimeThread stopth in threads) { stopth.stop = true; } listener.Stop(); } public static void Run() { while (true) { Console.WriteLine("Warte auf Client."); try { TcpClient c = listener.AcceptTcpClient(); } catch(SocketException ex) { Console.WriteLine("Server beendet."); return; } if(c!=null) { Console.WriteLine("Client gefunden! Übertragung gestartet!"); threads.Add(new TimeThread(c)); } } } } }
2) Du kannst im Client-Programm ein Dialog programmieren, wo IP-Adresse und Port des Servers eingegeben werden.
Grüße
- Als Antwort markiert R3turnz Sonntag, 11. Oktober 2015 13:02
Alle Antworten
-
Hallo,
1) Beim Aufruf der Methode Abort
th.Abort();
wird eine ThreadAboardException ausgelöst. Weil diese Exception im Thread nicht abgefangen wird, wird das Programm (vermute ich) abgebrochen.
Die Methode Abort ist mit Vorsicht zu genießen, weil man nicht weißt in welchem Zustand den Thread abgebrochen wird.
2) Du kannst auch über IP Adresse auf den Server zugreifen.
Grüße
-
Hallo,
1) Ich bekomme es einfach nicht hin:
Das habe ich probiert:
Console.WriteLine("Warte auf Client."); TcpClient c = null; if (stop == true) { listener.Stop(); } else if(stop == false) { c = listener.AcceptTcpClient(); threads.Add(new TimeThread(c)); Console.WriteLine("Client gefunden! Übertragung gestartet!"); } }
foreach(TimeThread stopth in threads) { stopth.stop = true; } stop = true; th.Abort();
2) Wie kann ich die Clients dann auf die IP des Servers synchronisieren?
LG
-
Hallo,
1) Ungefähr so:
namespace TimeServer { public class TimeServer { private static TcpListener listener = null; private static ArrayList threads = new ArrayList(); public static void Main(string[] args) { Console.WriteLine("Wilkommen. Starte...."); listener = new TcpListener(4711); listener.Start(); Thread th = new Thread(new ThreadStart(Run)); th.Start(); string cmd = ""; while(cmd.ToLower() != "stop") { cmd = Console.ReadLine(); if(cmd != "stop") { Console.WriteLine("Unbekannter Befehl"); } } foreach(TimeThread stopth in threads) { stopth.stop = true; } listener.Stop(); } public static void Run() { while (true) { Console.WriteLine("Warte auf Client."); try { TcpClient c = listener.AcceptTcpClient(); } catch(SocketException ex) { Console.WriteLine("Server beendet."); return; } if(c!=null) { Console.WriteLine("Client gefunden! Übertragung gestartet!"); threads.Add(new TimeThread(c)); } } } } }
2) Du kannst im Client-Programm ein Dialog programmieren, wo IP-Adresse und Port des Servers eingegeben werden.
Grüße
- Als Antwort markiert R3turnz Sonntag, 11. Oktober 2015 13:02
-
Hallo,
In deinem Fall kannst Du überprüfen, ob die Daten nach der Verbindung ankommen oder nicht. Falls die Daten eine bestimmte Zeitintervall von Server nicht ankommen, dann heißt das, dass der Server die Verbindung getrennt hat.
Oder Du kannst dein Kommunikationsprotokoll mit einem zusätzlichen Telegramm für das Beenden der Verbindung erweitern.
Grüße