c#中的UDP监听器

本文关键字:监听器 UDP 中的 | 更新日期: 2023-09-27 18:13:49

我试图在Windows窗体内创建UDP侦听器。我想监听地址和端点,并希望在表单上的文本框中显示接收到的文本。我试着从不同的角度来解决这个问题。

我的一个尝试是尝试使用BackgroundWorker来允许侦听器代码保持运行,同时仍然在UI线程中拥有控制权。当监听器继续监听时,我想继续添加发送到多行文本框的ascii数据(使用Visual Studio 2010和c#)。我已经向表单添加了一个BackgroundWorker,这样我就可以启动和停止侦听器。我可以从发送方客户端接收测试并将其显示在MessageBox中,但在使用相同文本更新表单上的文本框时遇到麻烦(这是我实际想要做的)。

我尝试过的另一个角度是尝试从堆栈溢出的帖子中使用UdpClient调用BeginReceive方法的AsyncCallback的代码。在示例中,回调使用传入UdpClient的方法调用EndReceive方法,获取数据,然后使用Console.WriteLine将其打印出来。我尝试了该代码,试图将收到的文本添加到表单上的文本框中,但无济于事。是否有一种方法来显示在一个文本框中收到的文本使用一个BackgroundWorkder,或者可能是一个UdpClient,或者我应该调查使用一个单独的线程或其他方式。没有做过任何多线程程序,在这方面我是一个新手。任何帮助都会很感激。谢谢。

c#中的UDP监听器

你可能已经接近你的BackgroundWorker实现了;你只需要确保后台线程永远不会尝试更新UI。你必须移动你的代码来更新文本框到你附加到BackgroundWorker的ProgressChangedEventHandler。当您收到消息时,更新缓冲区(用锁保护)并调用ReportProgress方法。ReportProgress方法将调用UI线程上的ProgressChangedEventHandler,它可以根据缓冲区中的内容更新文本框。

最好的方法是您已经尝试过的异步读取。这在本质上与使用后台worker做同样的事情,但是库为你做了所有的工作。棘手的一点是,您的数据接收事件是在工作线程上调用的,因此要更新UI,您需要将控制权转移回UI线程。这可以通过在任何UI元素(窗体或控件)上使用'BeginInvoke'来在正确的线程上执行更新代码来完成。如果你对此进行搜索,你会发现大量的例子