草庐IT

c# - 希望对 SQL Server 数据库应用程序的 C# TCP 监听器进行代码改进

coder 2023-09-19 原文

我构建了一个 C# 控制台应用程序,它接受来 self 拥有的 GPS 报告设备的 TCP 连接。我构建此应用程序是为了收集该数据并将其转储到 SQL Server 表中。

目前,我的应用程序正在运行,但它有一个我似乎无法弄清楚的错误。当 GPS 设备建立连接时,随机 1-10 个成功连接中的一个给我一个索引超出范围的异常。

当我转储原始数据时,它看起来不像是设备发送给我的东西。你们中有人碰巧知道是什么原因造成的吗?此外,一旦我让这个应用程序正常工作,它可能每分钟接收多达 3-5k 个连接,你认为这段代码可以处理这个问题吗?

这是我经常收到的错误,带有杂项数据转储:

Image of error

这是我的代码:

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();
          }
        }
    }
}

最佳答案

错误与传入数据有关,它要么是配置为以不同方式发送数据的 gps 设备,要么是一些随机的 tcp 事件。检查您在谷歌搜索中使用的端口号,并确保它没有为其他用途保留。

这段代码肯定不会处理那么多连接,您遍历一个字节数组并一次转换一个字符(改为使用 System.Text.Encoding.ASCII.GetString(byte[])),您打开和关闭一个在接收 block 内连接到 sql server 等等。为了处理这种事件,您只需读取数据并将其放入总线或临时存储中进行批量处理。

关于c# - 希望对 SQL Server 数据库应用程序的 C# TCP 监听器进行代码改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38232477/

有关c# - 希望对 SQL Server 数据库应用程序的 C# TCP 监听器进行代码改进的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  7. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  8. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  9. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐