Click here to Skip to main content
15,887,428 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi All
i'm working on gps tracking system
now i'm working on receiving data from gps devices throw tcp port
using tcpListner class then arrange the data then save it to sql server
i have created a console application to do so then convert it to windows service using NSSM
it is working as expected but after about 30 minutes it consumes all the server memory and CPU
it is only 4 devices connected (Test Phase)

What I have tried:

C#
using System;
using System.Threading;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using System.Data;
using Microsoft.SqlServer.Types;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener serverSocket = new TcpListener(8889);
            TcpClient clientSocket = default(TcpClient);
            int counter = 0;
            serverSocket.Start();
            counter = 0;
            while (true)
            {
                counter += 1;
                clientSocket = serverSocket.AcceptTcpClient();
                handleClinet client = new handleClinet();
                client.startClient(clientSocket, Convert.ToString(counter));
            }
            clientSocket.Close();
            serverSocket.Stop();
           }
    }

    //Class to handle each client request separatly
    public class handleClinet
    {
       static void WriteLog(string message, EventLogEntryType type)
        {
            using (EventLog eventLog = new EventLog("Application"))
            {
                eventLog.Source = "Application";
                eventLog.WriteEntry(message, type, 101, 1);
            }
        }
        static int InsideDangerArea(double Lat, double Lng)
        {
            string point = "POINT(" + Lng + "  " + Lat + ")";
            string ConnStr = "Data Source =.; Initial Catalog=                     GPS_Tracking;Integrated Security = True";
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
          conn.Open();
       using (SqlCommand comm = new SqlCommand("Select id from T_Geofncies", conn))
                {
                    DataTable dt = new DataTable();
                    dt.Load(comm.ExecuteReader());
                   foreach (DataRow dr in dt.Rows)
                    {
                        string Query = "  DECLARE @g geometry; DECLARE @h geometry; SET @g = (select(points) from T_Geofncies where id=" + dr["id"].ToString() + " );";
                        Query += " SET @h = geometry::STGeomFromText('" + point + "', 4326); SELECT @g.STContains(@h);";
                        comm.CommandText = Query;
                        int Val = Convert.ToInt32(comm.ExecuteScalar());
                        if (Val == 1)
                        {
                            conn.Close();
                            conn.Dispose();
                            return Convert.ToInt32(dr["id"]);
                        }
                    }
                }
                conn.Close();
                conn.Dispose();
            }
            return 0;
        }

        static int OutsideSafeArea(double Lat, double Lng)
        {

            string point = "POINT(" + Lng + "  " + Lat + ")";

            string ConnStr = "Data Source =.; Initial Catalog = GPS_Tracking;Integrated Security = True";
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();
                using (SqlCommand comm = new SqlCommand("Select id from T_SafeArea", conn))
                {
                    DataTable dt = new DataTable();
                    dt.Load(comm.ExecuteReader());

                    foreach (DataRow dr in dt.Rows)
                    {
                        string Query = "  DECLARE @g geometry; DECLARE @h geometry; SET @g = (select(points) from T_SafeArea where id=" + dr["id"].ToString() + " );";
                        Query += " SET @h = geometry::STGeomFromText('" + point + "', 4326); SELECT @g.STContains(@h);";
                        comm.CommandText = Query;
                        int Val = Convert.ToInt32(comm.ExecuteScalar());
                        if (Val == 1)
                        {
                            conn.Close();
                            conn.Dispose();
                            return Convert.ToInt32(dr["id"]);
                        }

                    }
                }
                conn.Close();
                conn.Dispose();
            }
            return 0;
        }
        static SqlGeography GetGeographyFromText(String pText)
        {
            SqlString ss = new SqlString(pText);
            SqlChars sc = new SqlChars(ss);
            try
            {
                return SqlGeography.STPointFromText(sc, 4326);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        TcpClient clientSocket;
        string clNo;
        public void startClient(TcpClient inClientSocket, string clineNo)
        {
            this.clientSocket = inClientSocket;
            this.clNo = clineNo;
            Thread ctThread = new Thread(doChat);
            ctThread.Start();
        }
        private void doChat()
        {
            string ConnStr = "Data Source =.; Initial Catalog = GPS_Tracking;Integrated Security = True";

            int requestCount = 0;
            // byte[] bytesFrom = new byte[10025];
            string dataFromClient = null;
            Byte[] sendBytes = null;
            string serverResponse = null;
            string rCount = null;
            requestCount = 0;

            while ((true))
            {
                try
                {
                    requestCount = requestCount + 1;
                    NetworkStream networkStream = clientSocket.GetStream();
                    int i;
                    int size = (int)clientSocket.ReceiveBufferSize;
                    // Loop to receive all the data sent by the client.
                    Byte[] bytes = new Byte[size];
                    string data = "";
                    string IMEI;
                    while ((i = networkStream.Read(bytes, 0, bytes.Length)) != 0)
                    {

                        try
                        {
                            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);

                            string[] tokens = data.Split(new[] { "GPRMC" }, StringSplitOptions.None);
                            var longest = Regex.Matches(data, @"\d+").Cast<match>().OrderByDescending(m => m.Length).First();


                            IMEI = longest.ToString();
                            if (IMEI.Length > 15)
                                IMEI = IMEI.Substring(1);



                            foreach (string item in tokens)
                            {
                                try
                                {
                                    string[] Values = item.Split(',');                                   // Console.WriteLine("Received: {0}", data);
                                    string time = Values[1];
                                    // Console.WriteLine("Time= " + time);
                                    string lat;
                                    string lng;
                                    string speed;
                                    string date;

                                    lat = Values[3];
                                    lng = Values[5];
                                    speed = Values[7];
                                    date = Values[9];

                                    string NewDString = date.Substring(2, 2) + date.Substring(0, 2) + date.Substring(4, 2);

                                    //  Console.WriteLine("IMEI= " + IMEI);

                                    // Alternate choice: If the string has been input by an end user, you might  
                                    // want to format it according to the current culture: 
                                    // IFormatProvider culture = System.Threading.Thread.CurrentThread.CurrentCulture;
                                    string myDate = (NewDString + time).Insert(2, "-").Insert(5, "-").Insert(8, " ").Insert(11, ":").Insert(14, ":");


                                    double latDeg = Convert.ToDouble(Convert.ToDouble(lat).ToString().Substring(0, 2));
                                    double latMin = Convert.ToDouble(Convert.ToDouble(lat).ToString().Substring(2));

                                    double lngDeg = Convert.ToDouble(Convert.ToDouble(lng).ToString().Substring(0, 2));
                                    double lngmin = Convert.ToDouble(Convert.ToDouble(lng).ToString().Substring(2));

                                    double latmap = latDeg + (latMin / 60);
                                    //  OldLat=
                                    double lngmap = lngDeg + (lngmin / 60);
                                    //if ((Math.Round(latmap, 3) != Math.Round(OldLat, 3) && Math.Round(lngmap, 3) != Math.Round(OldLng, 3)) || idleRecord > 30)
                                    //{
                                    using (SqlConnection conn = new SqlConnection(ConnStr))
                                    {
                                        conn.Open();
                                        using (SqlCommand cmd = conn.CreateCommand())
                                        {
                                            // DbCommand also implements IDisposable

                                            // create command with placeholders
                                            cmd.CommandText =
                                               "INSERT INTO T_Tracking " +
                                               "([IMEI], [TrackTime],  [Longitude], [Lattitude],  [speed],[MapPoint],[SafeAreaID],[GeoFenceID]) " +
                                               "VALUES(@IMEI, @TrackTime,  @Longitude, @Lattitude,  @speed,@MapPoint,@SafeAreaID,@GeoFenceID)";


                                            SqlParameter p_IMEI = new SqlParameter("@IMEI", IMEI);
                                            cmd.Parameters.Add(p_IMEI);

                                            SqlParameter p_TrackTime = new SqlParameter("@TrackTime", myDate);
                                            cmd.Parameters.Add(p_TrackTime);

                                            SqlParameter p_Longitude = new SqlParameter("@Longitude", lngmap);
                                            cmd.Parameters.Add(p_Longitude);

                                            SqlParameter p_Lattitude = new SqlParameter("@Lattitude", latmap);
                                            cmd.Parameters.Add(p_Lattitude);

                                            SqlParameter p_Speed = new SqlParameter("@speed", speed);
                                            cmd.Parameters.Add(p_Speed);
                                            SqlParameter p_Points = new SqlParameter("@MapPoint", System.Data.SqlDbType.Udt);
                                            p_Points.UdtTypeName = "geometry";
                                            p_Points.Value = GetGeographyFromText("Point(" + lngmap + "  " + latmap + ") ");
                                            cmd.Parameters.Add(p_Points);
                                            SqlParameter P_Safe = new SqlParameter("@SafeAreaID", OutsideSafeArea(latmap, lngmap));
                                            cmd.Parameters.Add(P_Safe);
                                            SqlParameter P_GeoFence = new SqlParameter("@GeoFenceID", InsideDangerArea(latmap, lngmap));
                                            cmd.Parameters.Add(P_GeoFence);
                                            // execute
                                            cmd.ExecuteNonQuery();

                                        }
                                        //}
                                        //else
                                        //    idleRecord = idleRecord + 1;

                                    }
                                }
                                catch (Exception exp) { WriteLog(exp.ToString(), EventLogEntryType.Error); }
                            }

                            
                        }
                        catch { }
                    }
                  
                }
                catch (Exception ex)
                {
                    // Console.WriteLine(" >> " + ex.ToString());
                }
            }
        }
    }
}
Posted
Updated 7-Nov-16 10:18am
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900