我从本地主机接收 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());
}
}
}
}