0

我从本地主机接收 UDP 数据。需要使用并跟踪这些数据。在大约 5 分钟的过程中可能会发送超过 250k 的数据包。目前,我创建了 IPEndPoint,并接收数据。然后我将 byte[] 数据转换为字符串。然后我将字符串拆分为一个数组,因为数据是逗号分隔的。从这个数组中,我用数组中的正确值实例化一个对象。

传入的数据有 4 个属性,如下所示:ProductId=1284,Quantity=48623,Time=08:45:12.034,Date=2019-09-09

目前我能够 Console.WriteLine 传入的数据包,并将每个数据包转换为一个对象(产品)。目前我没有将数据存储在任何地方。

我需要监控数量级别,并在数量高于或低于某些阈值时发送警报。其次,如果数量的变化超过阈值,我需要发送另一个警报。我稍后将使用 if 语句来实现这一点,目前不需要帮助。确实需要在收到 UDP 数据包时发送此警报。

我的问题是:

1)我应该异步实现,还是在不同的线程上实现?

2) 我是否应该将 UDP 数据直接发送到 byte[] 类型的队列,然后将每个 byte[] 出列到一个对象中?还是在收到 UDP 数据时即时实例化新对象(或更新每个产品的数量)?队列是否降低了丢包的风险?

3) 存储每个数据包的最佳方式是什么?到一个列表(这会将所有内容都保存在内存中)、一个数据库(有点超出我当前的需要),还是将每个对象附加到一个文本文件(易于写入,最终可以从中构建数据库)?

4) 5 分钟内是否有 250k 个数据包,并且为所有这些数据包创建对象对于计算机来说处理起来很费力?

请告知我是否可以澄清任何事情。如果我的任何术语不正确,我深表歉意,我会学习并修复它。我应该能够自己弄清楚编码,这是我要求指导的设计和正确实现。谢谢你。

下面是用于设置 UDP 连接和类的代码。正确设置 UDP 后,我将能够计算出监控/消息传递数量信息。我确实有一个未显示的产品类,它有几个属性,包括 ProductId、数量、初始数量、数量变化、时间和日期。

class Program
    {
        static void Main(string[] args)
        {
            int port = 22486;
            var client = new UdpClient();
            IPEndPoint localEp = new IPEndPoint(IPAddress.Any, port);
            client.Client.Bind(localEp);

            while (true)
            {
                try
                {
                    byte[] data = client.Receive(ref localEp);
                    string text = Encoding.UTF8.GetString(data);
                    string[] message = text.Split(',', '=');
                    Product product = new Product();
                    product.ProductId = message[1];
                    product.Quantity = message[3];
                }
                catch (Exception err)
                {
                    Console.WriteLine(err.ToString());
                }
            }
        }
    }
4

1 回答 1

0
  1. 如果您在侦听该端口时需要做其他事情,请将其设为线程。

  2. 将它排入一个字节数组......一个各种各样的缓冲区。

  3. 天蓝色 blob 适合您吗?您可以使用存储模拟器,如果您改变了将文件存储在 blob 中的想法,则可以切换到表存储(这就像您提供分区名称的 nosql 方法。)

于 2019-09-09T18:15:23.010 回答