2016-07-06 9 views
1

Ich habe eine C# -Konsolen-App erstellt, die TCP-Verbindungen von GPS-Berichtsgeräten akzeptiert, die ich habe. Ich habe diese App erstellt, um diese Daten zu sammeln und sie in eine SQL Server-Tabelle zu schreiben.Ich möchte Codeverbesserung für C# TCP-Listener zu SQL Server-Datenbank-App

Derzeit habe ich die Anwendung funktioniert, aber es hat einen Fehler, den ich nicht scheinen kann, herauszufinden. Da die GPS-Geräte Verbindungen herstellen, gibt mir eine von zufälligen 1-10 erfolgreichen Verbindungen eine Ausnahme außerhalb des Bereichs.

Wenn ich die rohen Daten ablege, sieht es nicht wie etwas aus, das das Gerät mir sendet. Würde irgendjemand von euch wissen, was das verursacht? Wenn diese Anwendung richtig funktioniert, könnte sie auch bis zu 3-5k Verbindungen pro Minute erhalten. Glauben Sie, dass dieser Code damit umgehen könnte?

Dies ist der Fehler, den ich jeder so oft, mit dem Abwerfen des misc Daten erhalten:

Image of error

Dies ist mein Code:

namespace GPS2DB 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       IPAddress ipAddress = IPAddress.Parse("10.71.150.253"); 

       Console.WriteLine("Waiting for Tracker Connections..."); 

       TcpListener listener = new TcpListener(ipAddress, 10000); 

       listener.Start(); 

       while (true) 
       { 
        Socket client = listener.AcceptSocket(); 
        Console.WriteLine("Connection accepted."); 

        var childSocketThread = new Thread(() => 
        { 

         byte[] data = new byte[1024]; 
         int size = client.Receive(data); 
         string gpsData = ""; 

         for (int i = 0; i < size; i++) 
         { 
          Console.Write(Convert.ToChar(data[i])); 
          gpsData = gpsData + Convert.ToChar(data[i]); 
         } 

         string txt = gpsData; 
         string txt2 = (txt.Trim(new Char[] { '$', '#' })); 

         String[] values = txt2.Split(','); 
         //Console.WriteLine(txt2); 
         /* 
         Console.WriteLine("Unit ID: " + values[0]); 
         Console.WriteLine("Event Code: " + values[1]); 
         Console.WriteLine("UTC Date: " + values[2]); 
         Console.WriteLine("UTC Time: " + values[3]); 
         Console.WriteLine("Lat: " + values[4]); 
         Console.WriteLine("Long: " + values[5]); 
         Console.WriteLine("Speed: " + values[7]); 
         Console.WriteLine("Heading: " + values[11]); 
         Console.WriteLine("V+: " + values[16]); 
         Console.WriteLine("Cell Strength: " + values[17]); 
         Console.WriteLine("GPS Status: " + values[18]); 
         Console.WriteLine("Fuel Level: " + values[20]); 
         */ 

         //dump 2 database 
         string connectionString = "Data Source=DVT501;Initial Catalog=VehicleTracking;Persist Security Info=True;User ID=TABLE;Password=PASS"; 

         using (SqlConnection connection = new SqlConnection(connectionString)) 
         { 
          SqlCommand cmd = new SqlCommand("INSERT INTO Data_Dump (uid, eventCode, utcDate, utcTime, lat, long, speed, heading, voltage, cellStrength, gpsStatus, fuelLevel) VALUES (@uid, @eventCode, @utcDate, @utcTime, @lat, @long, @speed, @heading, @voltage, @cellStrength, @gpsStatus, @fuelLevel)"); 
          cmd.CommandType = System.Data.CommandType.Text; 
          cmd.Connection = connection; 

          try 
          { 

          cmd.Parameters.AddWithValue("@uid", values[0]); 
          cmd.Parameters.AddWithValue("@eventCode", values[1]); 
          cmd.Parameters.AddWithValue("@utcDate", values[2]); 
          cmd.Parameters.AddWithValue("@utcTime", values[3]); 
          cmd.Parameters.AddWithValue("@lat", values[4]); 
          cmd.Parameters.AddWithValue("@long", values[5]); 
          cmd.Parameters.AddWithValue("@speed", values[7]); 
          cmd.Parameters.AddWithValue("@heading", values[11]); 
          cmd.Parameters.AddWithValue("@voltage", values[16]); 
          cmd.Parameters.AddWithValue("@cellStrength", values[17]); 
          cmd.Parameters.AddWithValue("@gpsStatus", values[18]); 
          cmd.Parameters.AddWithValue("@fuelLevel", values[20]); 

          connection.Open(); 
          cmd.ExecuteNonQuery(); 
         } 
         catch (System.IndexOutOfRangeException e) 
         { 
          Console.WriteLine("IndexOutOfRangeException caught" + e); 
          Console.WriteLine(txt); 
         } 
        } 

        //end dump 
        Console.WriteLine(); 

        client.Close(); 
       }); 

       childSocketThread.Start(); 
      } 

      listener.Stop(); 
      }    
      catch (Exception e) 
      { 
       Console.WriteLine("Error: " + e.StackTrace); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 
+0

C# behandelt keine Verbindungen Pooling den Weg wie sagen wir 'Delphi' also, wenn Sie erwarten, dass viele Verbindungen/Minute .. Sie werden nicht mit der Tatsache glücklich sein, dass Sie in Probleme stoßen .. auch versuchen, zu erstellen eine Liste zum Speichern der GPS-Daten in und sehen, ob Sie immer noch den gleichen Fehler bekommen .. – MethodMan

+0

Geringfügige Abweichung vom Thema zur Hand. AddWithValue kann Datentypen fälschlicherweise interpretieren, wenn sql so ausgeführt wird. http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-ready/ –

Antwort

0

Der Fehler ist mit den eingehenden Daten, Es ist entweder ein GPS-Gerät, das konfiguriert ist, um Daten anders zu senden oder ein zufälliges tcp-Ereignis. Überprüfen Sie die Portnummer, die Sie in einer Google-Suche verwenden, und vergewissern Sie sich, dass sie nicht für etwas anderes reserviert ist.

Dieser Code wird auf jeden Fall nicht so viele Verbindungen verarbeiten, Sie durchlaufen ein Byte-Array und konvertieren ein Zeichen nach dem anderen (verwenden Sie stattdessen System.Text.Encoding.ASCII.GetString (byte []), Sie öffnen und schließen eine Verbindung zum SQL-Server innerhalb des Empfangsblocks und so weiter. Um diese Art von Aktivität zu bewältigen, müssen Sie nur die Daten lesen und sie in einen Bus- oder Temporärspeicher legen, um in Massen verarbeitet zu werden.

0

Sie gehen davon aus, dass Sie jeweils eine Nachricht lesen. TCP stellt einen grenzenlosen Bytestrom bereit. Sie können eine Teilnachricht oder mehrere Nachrichten sehr gut lesen.

Wie Sie damit umgehen, hängt vom Format des Streams ab. Wenn es auf Linie basiert StreamReader.ReadLine() ist eine großartige Lösung.