当前位置: 首页 > 知识库问答 >
问题:

C#.Net UdpClient 接收事件

云卓
2023-03-14

我想知道是否有任何方法可以在我的Udp客户端接收数据时以某种方式触发事件?(System. Net. Socket. Udp客户端)

我尝试覆盖它的 UdpClient.Receive,但我不能根据这个,因为可覆盖的成员必须标记为虚拟或抽象。

我目前的做法是在Threading.Timer上运行一个TimerCallback,以特定的时间间隔来获取我的数据,但我更愿意在传入数据到达时接收它,而不是重复获取它。

关于我如何做到这一点,或者我必须在间隔时间手动接收的任何建议、建议或指针?

共有3个答案

黄隐水
2023-03-14

UdpClient.Receive 会阻止执行,直到它从endpoint接收数据。但是有一个异步的替代方案,UdpClient.BeginReceive。它不完全是一个事件,但以类似的方式工作,你可以封装它并触发你自己的事件。文档(带有代码示例)可以在这里找到:http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.beginreceive(v=vs.110).aspx

经伟
2023-03-14

您也可以使用Rx扩展来接收数据。

ReceiveAsyncUpd客户端包装到可观察. FromAsync并订阅可观察的。

UdpClient client = new UdpClient(..., ...);
var obs = Observable.FromAsync(client.ReceiveAsync);
var sub = obs.Subscribe(...);
严项明
2023-03-14

覆盖< code>Receive方法对您没有任何帮助——它不是UDP客户端接收数据时调用的方法,而是您想要等待传入数据时调用的方法。

但是,接收方法阻止。这意味着您实际上不必每隔一段时间进行检查 - 您可以简单地检查(几乎)无限循环。只需在不同的线程中执行此操作即可。

void Loop(CancellationToken token)
{
  var remoteEP = default(IPEndPoint);

  while (!token.IsCancellationRequested)
  {
    var data = client.Receive(ref remoteEP);

    yourForm.Invoke(DataReceived, data);
  }
}

当然,因为这是简单的I/O,所以没有必要占用一个线程来做这件事——您可以使用异步I/O:

public Task Loop(CancellationToken token)
{
  using (UdpClient client = new UdpClient(80))
  {
    while (!token.IsCancellationRequested)
    {
      var data = await client.ReceiveAsync();

      // Process the data as needed
    }
  }
}

在 winforms 或 WPF 应用程序中,这将几乎自动工作 - 您只需在事件处理程序中使用此代码btnStart_Click它将在后台等待数据时保持 UI 响应;每当数据返回时,它将在 UI 线程上执行其余代码(根据需要处理数据)——无需手动创建任何线程或处理调度。

当然,处理终止有些棘手,但这在UDP中总是很棘手——基本上,您要么必须使用支持取消的更手动的方式(ReceiveAsync只是不支持取消的开始接收结束接收的包装器),要么您将使用设置取消令牌然后向自己发送0长度封包的老技巧(导致接收调用结束并返回零长度字节数组)。

 类似资料:
  • 问题内容: 我正在尝试开发一个可检测用户何时拍照的应用程序。我设置了广播接收器类,并通过以下方式将其注册到清单文件中: 无论我做什么,该程序都不会收到广播。这是我的接收器类: 如果删除清单和活动中的mimeType行,则使用以下命令发送自己的广播 然后我成功接收到广播,可以看到日志和吐司窗口​​。我是否采用正确的方法?有什么需要补充的吗? 问题答案: 我解决了这个问题,但是使用了另一种方法。我没有

  • 我已经在互联网上搜索了一两个星期,想找到一个UDP客户端程序,它可以同时发送和接收数据,但是对于c#来说,没有关于这个主题的内容。在过去的几天里,我尝试创建一个UDP客户端,其中包含一个接收数据的线程。 发送UDP数据包效果很好,但程序无法接收我发送到的服务器,我相信服务器正在将所有数据包发送到不同的端口。 我如何修复这个程序? 有没有一种更简单的方法来进行UDP编程,比如用于TCP的Stream

  • http://Socket.io允许你触发或响应自定义的事件,除了connect,message,disconnect这些事件的名字不能使用之外,你可以触发任何自定义的事件名称。 服务器端 // 注意,io(<端口号>) 将为你创建一个http服务。 var io = require('socket.io')(80); io.on('connection', function (socket)

  • 这里是我的application.yml的相关部分 从文档中,我发现应该创建一个SpringAMQPMessageSource bean: 如果我从rabbitmq管理面板向队列发送消息,我会看到日志: SpringAMQPMessageSource的JavaDoc是这样说的: 但到现在我都找不到在哪里注册,也找不到怎么注册。 配置中的Axon.EventHandling条目和聚合中的@Proce

  • 目标:使用python从EventHub接收消息。 设置: Python 3.5 AMQP 1.0 在新门户中创建的EventHub。 Ubuntu 16.04和Mac OS X。 质子==0.8.8和python-qpid-质子==0.17.0 几天来,我一直在尝试连接AMQP和Azure EventHub。我可以用Java客户端很好地做到这一点(作为确保EventHub工作的测试),但我需要能

  • 我已经意识到事件源、CQRS、DDD和微服务有一段时间了,现在我想尝试并开始实施一些东西并尝试一些东西。 我一直在研究CQRS的技术方面,我理解其中的DDD概念。写入端如何处理来自UI的命令并发布其中的事件,以及读取端如何处理事件并在其上创建投影。 我遇到的困难是沟通 所以我想重点关注eventstore(这一个:https://eventstore.com/不那么模棱两可)。这就是我想要使用的,