2017-03-02 5 views
0

Ich versuche, ein Programm zu entwickeln (Windows-Dienst im Grunde), um kontinuierlich eine IP-Adresse und einen PORT zu hören, auf dem ein Gerät Daten im 30-Sekunden-Intervall per Telnet sendet.Wie Ip/Port kontinuierlich für Daten mit TCP/IP-Protokoll zu hören?

Nun habe ich viel gegooglet und wie ich verstehe TCPClient oder TCPListener kann verwendet werden, um Daten von Telnet zu empfangen. Ich habe ein paar Lösungen im Internet durchgegangen, aber die meisten von ihnen sind einmal schreiben und lesen Lösung, aber ich muss auf diese IP kontinuierlich hören. Ich muss nichts senden, nur auf die Daten warten und das in SQL SERVER DB speichern (ich habe mit diesem Code getan). Folgendes ist der Client-Code, den ich versucht habe:

private void Form1_Load(object sender, EventArgs e) 
    { 
     msg("Client Started"); 
     clientSocket.Connect(IPAdd, 23); 
     label1.Text = "Client Socket Program - Server Connected ..."; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     NetworkStream serverStream = clientSocket.GetStream(); 

     StreamReader objstream = new StreamReader(path, UnicodeEncoding.Unicode); 
     //textBox1.Text = objstream.ReadLine(); 

     byte[] outStream = System.Text.Encoding.ASCII.GetBytes(objstream.ReadToEnd() + "$"); 
     serverStream.Write(outStream, 0, outStream.Length); 
     serverStream.Flush(); 

     byte[] inStream = new byte[clientSocket.ReceiveBufferSize]; 
     serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize); 
     string returndata = System.Text.Encoding.ASCII.GetString(inStream); 
     msg(returndata); 
     textBox2.Text = ""; 
     textBox2.Focus(); 

     string path = @"D:\TELNETResponse.txt"; 
     if (!File.Exists(path)) 
     { 
      File.Create(path); 
      TextWriter tw = new StreamWriter(path); 
      tw.WriteLine(returndata); 
      tw.Close(); 
     } 
     else if (File.Exists(path)) 
     { 
      using (var tw = new StreamWriter(path, true)) 
      { 
       tw.WriteLine(returndata); 
       tw.Close(); 
      } 
     } 
    } 

Jede Hilfe in dieser Hinsicht wird sehr geschätzt.

+0

Was ist Ihr spezifisches Problem? – OldProgrammer

+0

Wie ich bereits sagte, sendet ein Gerät alle 30 Sekunden Daten an einen bestimmten IP/PORT und ich muss diesen Port abhören, um diese Daten zu bekommen. – Arawn

+1

Das ist kein Problem, das ist eine Anforderung. Was ist falsch an dem angezeigten Code? http://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question – OldProgrammer

Antwort

0

Also, was Sie tun möchten, ist eine While-Schleife einzurichten, wenn Sie kontinuierlich hören wollen und das ist die einzige Operation dieser Anwendung. Der Code sollte unten wie etwas aussehen:

private void button1_Click(object sender, EventArgs e) 
{ 
    string data; 
    NetworkStream serverStream = clientSocket.GetStream(); 
    StreamReader streamReader = new StreamReader(serverStream, Encoding.Default); 
    string path = @"D:\TELNETResponse.txt"; 
    if (!File.Exists(path)) 
    { 
     File.Create(path); 
     TextWriter tw = new StreamWriter(path); 
     tw.WriteLine(returndata); 
     tw.Close(); 
    } 
    while ((data = streamReader.ReadLine()) != null) 
    { 
     using (var tw = new StreamWriter(path, true)) 
     { 
      tw.WriteLine(returndata); 
      tw.Close(); 
     } 
    } 
} 

Die streamReader nur NULL werden wird, wenn die Verbindung unterbrochen wird, an welcher Stelle Sie einige Code wollen würde Setup zu verbinden.

+1

Das wird den Haupt-UI-Thread blockieren. Entweder brauchen Sie async io oder separaten Thread – OldProgrammer

+0

Und basierend auf der Frage, ich denke, das ist OK in diesem Fall. Es sollte ein eigener Thread sein, aber dann scheint diese ganze Sache wie eine Konsolenanwendung zu sein. –

Verwandte Themen